emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/etags-regen 9cf8957 1/4: Merge branch 'master' into scratch/etag


From: Dmitry Gutov
Subject: scratch/etags-regen 9cf8957 1/4: Merge branch 'master' into scratch/etags-regen
Date: Mon, 6 Sep 2021 11:17:32 -0400 (EDT)

branch: scratch/etags-regen
commit 9cf8957ae1056b31a98658ecfe5977c06eb4d1d5
Merge: 7ee6e8f 9b318d5
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    Merge branch 'master' into scratch/etags-regen
---
 Makefile.in                                        |   98 +-
 admin/charsets/Makefile.in                         |    3 +-
 admin/emake                                        |    8 +-
 admin/grammars/Makefile.in                         |    3 +-
 admin/make-tarball.txt                             |    1 +
 admin/notes/years                                  |    6 +
 admin/unidata/Makefile.in                          |    3 +-
 configure.ac                                       |   61 +-
 doc/emacs/basic.texi                               |    7 +-
 doc/emacs/building.texi                            |    7 +
 doc/emacs/dired.texi                               |   23 +-
 doc/emacs/display.texi                             |   48 +-
 doc/emacs/docstyle.texi                            |    1 +
 doc/emacs/emacs.texi                               |    3 +
 doc/emacs/fixit.texi                               |    9 +-
 doc/emacs/frames.texi                              |    5 +-
 doc/emacs/help.texi                                |   59 +-
 doc/emacs/killing.texi                             |  126 +-
 doc/emacs/maintaining.texi                         |  177 ++
 doc/emacs/mini.texi                                |   16 +-
 doc/emacs/misc.texi                                |   24 +
 doc/emacs/package.texi                             |   23 +-
 doc/emacs/search.texi                              |   12 +-
 doc/emacs/text.texi                                |   15 +-
 doc/emacs/windows.texi                             |    3 +
 doc/lispref/backups.texi                           |    6 +
 doc/lispref/commands.texi                          |   11 +-
 doc/lispref/compile.texi                           |  256 ++-
 doc/lispref/debugging.texi                         |   13 +-
 doc/lispref/display.texi                           |   10 +-
 doc/lispref/elisp.texi                             |    6 +
 doc/lispref/files.texi                             |   29 +-
 doc/lispref/frames.texi                            |    9 +-
 doc/lispref/help.texi                              |   22 +-
 doc/lispref/internals.texi                         |    2 +-
 doc/lispref/loading.texi                           |   33 +-
 doc/lispref/macros.texi                            |    2 -
 doc/lispref/minibuf.texi                           |   16 +-
 doc/lispref/modes.texi                             |    7 +-
 doc/lispref/numbers.texi                           |    3 +-
 doc/lispref/os.texi                                |   22 +-
 doc/lispref/searching.texi                         |   14 +-
 doc/lispref/syntax.texi                            |   19 +-
 doc/lispref/text.texi                              |   35 +-
 doc/lispref/tips.texi                              |    6 +-
 doc/lispref/variables.texi                         |   14 +
 doc/lispref/windows.texi                           |  122 +-
 doc/man/emacs.1.in                                 |    4 +-
 doc/man/etags.1                                    |   23 +-
 doc/misc/autotype.texi                             |    2 +-
 doc/misc/calc.texi                                 |  722 +++----
 doc/misc/cc-mode.texi                              |  236 +--
 doc/misc/ede.texi                                  |  138 +-
 doc/misc/eieio.texi                                |   88 +-
 doc/misc/emacs-mime.texi                           |    5 +
 doc/misc/epa.texi                                  |   54 +-
 doc/misc/erc.texi                                  |    9 +-
 doc/misc/ert.texi                                  |    4 +
 doc/misc/gnus.texi                                 |   81 +-
 doc/misc/mh-e.texi                                 |  144 +-
 doc/misc/modus-themes.org                          |  893 +++++++--
 doc/misc/rcirc.texi                                |    6 +
 doc/misc/reftex.texi                               |    2 +-
 doc/misc/todo-mode.texi                            |   70 +-
 doc/misc/tramp.texi                                |   47 +-
 doc/misc/trampver.texi                             |    2 +-
 etc/HELLO                                          |    1 +
 etc/NEWS                                           |  497 ++++-
 etc/NEWS.27                                        |    2 +-
 etc/TODO                                           |   11 +-
 etc/emacs-mail.desktop                             |    4 +-
 etc/emacs.desktop                                  |    1 +
 etc/{emacs.appdata.xml => emacs.metainfo.xml}      |   25 +-
 etc/emacsclient-mail.desktop                       |   19 +
 etc/emacsclient.desktop                            |   14 +-
 etc/themes/modus-operandi-theme.el                 |    2 +-
 etc/themes/modus-themes.el                         | 1198 ++++++------
 etc/themes/modus-vivendi-theme.el                  |    2 +-
 etc/tutorials/TUTORIAL                             |    6 +-
 etc/tutorials/TUTORIAL.es                          |    6 +-
 etc/tutorials/TUTORIAL.he                          |    4 +-
 etc/tutorials/TUTORIAL.it                          |   34 +-
 etc/tutorials/TUTORIAL.sv                          |    6 +-
 leim/Makefile.in                                   |    4 +-
 lib-src/Makefile.in                                |    5 +-
 lib-src/etags.c                                    |  598 +++++-
 lib/Makefile.in                                    |    9 +-
 lisp/Makefile.in                                   |   14 +-
 lisp/allout.el                                     |    8 +-
 lisp/apropos.el                                    |  101 +-
 lisp/auth-source-pass.el                           |   61 +-
 lisp/auth-source.el                                |    7 +-
 lisp/bindings.el                                   |   43 +-
 lisp/bookmark.el                                   |  142 +-
 lisp/calendar/cal-menu.el                          |    6 +-
 lisp/calendar/iso8601.el                           |   17 +-
 lisp/calendar/time-date.el                         |    4 +-
 lisp/cedet/ede/base.el                             |   46 +-
 lisp/cedet/ede/config.el                           |    2 +-
 lisp/cedet/ede/generic.el                          |    2 +-
 lisp/cedet/ede/proj-obj.el                         |    4 +-
 lisp/cedet/ede/proj.el                             |   12 +-
 lisp/cedet/pulse.el                                |    9 +-
 lisp/cedet/semantic/db-ebrowse.el                  |    4 +-
 lisp/cedet/semantic/db-el.el                       |    4 +-
 lisp/cedet/semantic/db-javascript.el               |    4 +-
 lisp/cedet/semantic/db.el                          |    4 +-
 lisp/cedet/semantic/ede-grammar.el                 |   12 +-
 lisp/cedet/semantic/grm-wy-boot.el                 |   28 +-
 lisp/cedet/semantic/symref/grep.el                 |    2 +-
 lisp/cedet/srecode/compile.el                      |    7 +-
 lisp/cedet/srecode/insert.el                       |   17 +-
 lisp/comint.el                                     |   30 +-
 lisp/cus-start.el                                  |    1 +
 lisp/cus-theme.el                                  |  110 +-
 lisp/custom.el                                     |   41 +-
 lisp/delsel.el                                     |    7 +-
 lisp/desktop.el                                    |    5 +-
 lisp/dired-aux.el                                  |  311 +--
 lisp/dired-x.el                                    |  119 +-
 lisp/dired.el                                      |  231 ++-
 lisp/display-line-numbers.el                       |   21 +-
 lisp/doc-view.el                                   |    5 +
 lisp/electric.el                                   |    5 +-
 lisp/emacs-lisp/advice.el                          |    2 +-
 lisp/emacs-lisp/benchmark.el                       |    3 +-
 lisp/emacs-lisp/byte-opt.el                        |  105 +-
 lisp/emacs-lisp/bytecomp.el                        |  167 +-
 lisp/emacs-lisp/chart.el                           |    2 +-
 lisp/emacs-lisp/cl-extra.el                        |   15 +-
 lisp/emacs-lisp/cl-generic.el                      |   10 +-
 lisp/emacs-lisp/cl-macs.el                         |   17 +-
 lisp/emacs-lisp/cl-preloaded.el                    |   21 +-
 lisp/emacs-lisp/comp-cstr.el                       |   19 +-
 lisp/emacs-lisp/comp.el                            |  209 ++-
 lisp/emacs-lisp/copyright.el                       |   14 +-
 lisp/emacs-lisp/crm.el                             |    3 +-
 lisp/emacs-lisp/easy-mmode.el                      |   18 +-
 lisp/emacs-lisp/edebug.el                          |    2 +
 lisp/emacs-lisp/eieio-base.el                      |    2 +-
 lisp/emacs-lisp/eieio-core.el                      |  154 +-
 lisp/emacs-lisp/eieio-custom.el                    |    2 +-
 lisp/emacs-lisp/eieio-speedbar.el                  |   10 +-
 lisp/emacs-lisp/eieio.el                           |   57 +-
 lisp/emacs-lisp/eldoc.el                           |    2 +-
 lisp/emacs-lisp/elp.el                             |   48 +-
 lisp/emacs-lisp/ert-x.el                           |    2 +-
 lisp/emacs-lisp/ert.el                             |   52 +-
 lisp/emacs-lisp/find-func.el                       |   10 +-
 lisp/emacs-lisp/gv.el                              |    2 +-
 lisp/emacs-lisp/lisp-mnt.el                        |   26 +-
 lisp/emacs-lisp/lisp-mode.el                       |   14 +-
 lisp/emacs-lisp/lisp.el                            |  246 +--
 lisp/emacs-lisp/map.el                             |   32 +-
 lisp/emacs-lisp/nadvice.el                         |   18 +-
 lisp/emacs-lisp/package.el                         |   14 +-
 lisp/emacs-lisp/pp.el                              |    6 +-
 lisp/emacs-lisp/re-builder.el                      |    7 +-
 lisp/emacs-lisp/rmc.el                             |  154 +-
 lisp/emacs-lisp/rx.el                              |   24 +-
 lisp/emacs-lisp/shortdoc.el                        |   69 +-
 lisp/emacs-lisp/subr-x.el                          |   25 +-
 lisp/emacs-lisp/syntax.el                          |    4 +
 lisp/emacs-lisp/text-property-search.el            |   42 +-
 lisp/emacs-lisp/thunk.el                           |    2 +-
 lisp/epa-ks.el                                     |  345 ++++
 lisp/epa-mail.el                                   |   16 +-
 lisp/epa.el                                        |    5 +-
 lisp/erc/erc-services.el                           |   14 +-
 lisp/erc/erc.el                                    |    8 +-
 lisp/eshell/em-hist.el                             |    2 +-
 lisp/eshell/em-pred.el                             |  167 +-
 lisp/facemenu.el                                   |  105 +-
 lisp/faces.el                                      |   20 +-
 lisp/fileloop.el                                   |    3 +-
 lisp/files.el                                      |  620 +++---
 lisp/find-dired.el                                 |    4 +-
 lisp/find-file.el                                  |   14 +-
 lisp/font-lock.el                                  |   13 +-
 lisp/format.el                                     |    2 +-
 lisp/fringe.el                                     |   11 +-
 lisp/gnus/gnus-art.el                              |  148 +-
 lisp/gnus/gnus-fun.el                              |   11 +-
 lisp/gnus/gnus-group.el                            |   42 +-
 lisp/gnus/gnus-search.el                           |   27 +-
 lisp/gnus/gnus-sum.el                              |   90 +-
 lisp/gnus/gnus-topic.el                            |   54 +-
 lisp/gnus/gnus-util.el                             |   55 -
 lisp/gnus/gnus.el                                  |    8 +
 lisp/gnus/message.el                               |   11 +-
 lisp/gnus/mml.el                                   |    2 +-
 lisp/gnus/nnimap.el                                |   35 +-
 lisp/gnus/nnoo.el                                  |    2 +
 lisp/gnus/nnselect.el                              |    2 +-
 lisp/help-fns.el                                   |  149 +-
 lisp/help-macro.el                                 |   20 +-
 lisp/help-mode.el                                  |   39 +-
 lisp/help.el                                       |   53 +-
 lisp/hexl.el                                       |  136 +-
 lisp/hl-line.el                                    |    5 +-
 lisp/ibuffer.el                                    |   11 +-
 lisp/icomplete.el                                  |  439 +++--
 lisp/image.el                                      |   16 +-
 lisp/imenu.el                                      |    4 +-
 lisp/indent.el                                     |    4 +-
 lisp/info-xref.el                                  |    2 +-
 lisp/info.el                                       |   24 +-
 lisp/international/mule-cmds.el                    |   85 +-
 lisp/international/quail.el                        |   75 +-
 lisp/isearch.el                                    |   11 +-
 lisp/isearchb.el                                   |    1 -
 lisp/jka-compr.el                                  |    2 +-
 lisp/kmacro.el                                     |  119 +-
 lisp/language/ethio-util.el                        |   58 +-
 lisp/language/japan-util.el                        |    4 +-
 lisp/ldefs-boot.el                                 | 1921 +++++++++++++------
 lisp/leim/quail/latin-ltx.el                       |   52 +
 lisp/leim/quail/latin-post.el                      |   58 +
 lisp/leim/quail/latin-pre.el                       |   29 +
 lisp/loadup.el                                     |    4 +-
 lisp/mail/rmail.el                                 |   91 +-
 lisp/mail/rmailsum.el                              |    6 +-
 lisp/mail/sendmail.el                              |   46 +-
 lisp/mail/smtpmail.el                              |   39 +-
 lisp/mail/supercite.el                             |    2 +
 lisp/menu-bar.el                                   |   23 +-
 lisp/mh-e/mh-e.el                                  |    7 +-
 lisp/mh-e/mh-junk.el                               |   26 +-
 lisp/minibuffer.el                                 |  458 +++--
 lisp/misearch.el                                   |   27 +-
 lisp/mouse.el                                      |   21 +-
 lisp/mpc.el                                        |   33 +-
 lisp/msb.el                                        |    9 +-
 lisp/mwheel.el                                     |    5 +-
 lisp/net/ange-ftp.el                               |    6 +-
 lisp/net/browse-url.el                             |   56 +-
 lisp/net/dig.el                                    |   11 +-
 lisp/net/eudc.el                                   |   16 +-
 lisp/net/imap.el                                   |   52 +-
 lisp/net/mailcap.el                                |   23 +
 lisp/net/mairix.el                                 |   17 +-
 lisp/net/net-utils.el                              |   26 +-
 lisp/net/rcirc.el                                  |   47 +-
 lisp/net/shr.el                                    |   28 +-
 lisp/net/sieve-manage.el                           |   26 +-
 lisp/net/tramp-adb.el                              |    3 +-
 lisp/net/tramp-archive.el                          |   15 +-
 lisp/net/tramp-cache.el                            |   10 +-
 lisp/net/tramp-cmds.el                             |    6 +-
 lisp/net/tramp-compat.el                           |    5 +-
 lisp/net/tramp-gvfs.el                             |    2 +-
 lisp/net/tramp-integration.el                      |   16 +-
 lisp/net/tramp-sh.el                               |  273 +--
 lisp/net/tramp-sudoedit.el                         |    2 +-
 lisp/net/tramp.el                                  |  184 +-
 lisp/net/trampver.el                               |    6 +-
 lisp/nxml/rng-nxml.el                              |   15 +-
 lisp/org/org-clock.el                              |   26 +-
 lisp/org/org-colview.el                            |   60 +-
 lisp/org/org-compat.el                             |    4 +-
 lisp/org/org-mouse.el                              |   88 +-
 lisp/org/org-timer.el                              |   17 +-
 lisp/outline.el                                    |    6 +-
 lisp/play/morse.el                                 |   25 +-
 lisp/printing.el                                   |   27 +-
 lisp/profiler.el                                   |    8 +-
 lisp/progmodes/bug-reference.el                    |  155 +-
 lisp/progmodes/cc-defs.el                          |   14 +-
 lisp/progmodes/cc-engine.el                        |   33 +-
 lisp/progmodes/cc-langs.el                         |    3 +-
 lisp/progmodes/cc-mode.el                          |    2 +-
 lisp/progmodes/cperl-mode.el                       |   16 +-
 lisp/progmodes/elisp-mode.el                       |    2 +-
 lisp/progmodes/etags.el                            |    4 +-
 lisp/progmodes/fortran.el                          |  143 +-
 lisp/progmodes/gdb-mi.el                           |   15 +-
 lisp/progmodes/grep.el                             |   39 +-
 lisp/progmodes/gud.el                              |  136 +-
 lisp/progmodes/hideif.el                           | 1217 +++++++++---
 lisp/progmodes/hideshow.el                         |    6 +-
 lisp/progmodes/js.el                               |   23 +-
 lisp/progmodes/modula2.el                          |    5 +-
 lisp/progmodes/octave.el                           |    3 +-
 lisp/progmodes/perl-mode.el                        |    2 +-
 lisp/progmodes/project.el                          |   19 +-
 lisp/progmodes/python.el                           |    7 +-
 lisp/progmodes/ruby-mode.el                        |   14 +-
 lisp/progmodes/scheme.el                           |    5 +-
 lisp/progmodes/sh-script.el                        |   16 +-
 lisp/progmodes/sql.el                              |   46 +-
 lisp/progmodes/xref.el                             |   64 +-
 lisp/ps-mule.el                                    |    4 +-
 lisp/repeat.el                                     |   78 +-
 lisp/replace.el                                    |    3 +
 lisp/reposition.el                                 |  232 +--
 lisp/savehist.el                                   |   41 +-
 lisp/server.el                                     |   34 +-
 lisp/ses.el                                        |   13 +-
 lisp/shell.el                                      |   20 +-
 lisp/simple.el                                     |  381 ++--
 lisp/so-long.el                                    |    8 +-
 lisp/startup.el                                    |   37 +-
 lisp/subr.el                                       |   40 +-
 lisp/tab-bar.el                                    |   15 +-
 lisp/term/x-win.el                                 |    2 +-
 lisp/term/xterm.el                                 |   20 +-
 lisp/textmodes/css-mode.el                         |   20 +-
 lisp/textmodes/flyspell.el                         |   50 +-
 lisp/textmodes/ispell.el                           |   30 +-
 lisp/textmodes/makeinfo.el                         |    7 +
 lisp/textmodes/reftex-vars.el                      |    6 +-
 lisp/textmodes/sgml-mode.el                        |   15 +-
 lisp/textmodes/tex-mode.el                         |   13 +-
 lisp/textmodes/texinfo.el                          |  192 +-
 lisp/textmodes/texnfo-upd.el                       |   14 +
 lisp/textmodes/text-mode.el                        |   10 +-
 lisp/time-stamp.el                                 |  571 ++++--
 lisp/transient.el                                  |  119 +-
 lisp/uniquify.el                                   |    9 +-
 lisp/vc/diff-mode.el                               |   46 +-
 lisp/vc/ediff-diff.el                              |   10 +-
 lisp/vc/ediff-util.el                              |    9 +-
 lisp/vc/log-edit.el                                |  140 +-
 lisp/vc/vc-dispatcher.el                           |    2 +-
 lisp/vc/vc-git.el                                  |   18 +-
 lisp/vc/vc.el                                      |    3 +
 lisp/wdired.el                                     |   33 +-
 lisp/whitespace.el                                 |    3 +
 lisp/wid-edit.el                                   |    5 +-
 lisp/windmove.el                                   |  270 ++-
 lisp/window.el                                     |  328 +++-
 lisp/xdg.el                                        |    2 +-
 lwlib/Makefile.in                                  |    4 +-
 make-dist                                          |   18 +-
 nextstep/Makefile.in                               |   12 +-
 nt/Makefile.in                                     |    5 +-
 nt/mingw-cfg.site                                  |    5 +-
 src/Makefile.in                                    |    9 +-
 src/buffer.c                                       |   28 +-
 src/callproc.c                                     |   49 +-
 src/character.c                                    |   64 +-
 src/character.h                                    |    2 +-
 src/comp.c                                         |   92 +-
 src/composite.c                                    |   86 +-
 src/composite.h                                    |   21 +
 src/conf_post.h                                    |   31 +-
 src/data.c                                         |    4 +-
 src/dispextern.h                                   |    2 -
 src/dispnew.c                                      |   15 +-
 src/doc.c                                          |   26 +-
 src/doprnt.c                                       |    4 +-
 src/dynlib.c                                       |    2 +-
 src/editfns.c                                      |    6 +-
 src/emacs.c                                        |   17 +-
 src/eval.c                                         |    9 +-
 src/fileio.c                                       |   19 +-
 src/fns.c                                          |   23 +-
 src/frame.c                                        |  150 +-
 src/frame.h                                        |   14 +
 src/fringe.c                                       |    5 +-
 src/gmalloc.c                                      |   32 +-
 src/gnutls.c                                       |   11 +-
 src/gtkutil.c                                      |   28 +-
 src/image.c                                        |   35 +-
 src/indent.c                                       |    5 +
 src/keyboard.c                                     |  135 +-
 src/lisp.h                                         |    5 +-
 src/lread.c                                        |   35 +-
 src/minibuf.c                                      |   73 +-
 src/nsfns.m                                        |   24 +-
 src/nsfont.m                                       |    2 +-
 src/nsimage.m                                      |    9 +-
 src/nsmenu.m                                       |   69 +-
 src/nsterm.h                                       |   14 +-
 src/nsterm.m                                       |  347 ++--
 src/pdumper.c                                      |   27 +-
 src/process.c                                      |   44 +-
 src/process.h                                      |    1 +
 src/search.c                                       |   11 +-
 src/syntax.c                                       |   18 +
 src/sysdep.c                                       |   84 +-
 src/verbose.mk.in                                  |    2 +-
 src/w32.c                                          |   43 +-
 src/w32.h                                          |    1 +
 src/w32common.h                                    |    4 +-
 src/w32console.c                                   |    2 +-
 src/w32fns.c                                       |   20 +-
 src/w32heap.c                                      |    4 +-
 src/w32notify.c                                    |    2 +-
 src/w32proc.c                                      |    8 +-
 src/w32select.c                                    |    2 +-
 src/w32term.c                                      |    8 +-
 src/w32term.h                                      |    2 +-
 src/window.c                                       |   39 +-
 src/xdisp.c                                        |   77 +-
 src/xfaces.c                                       |    9 +-
 src/xfns.c                                         |   29 +-
 src/xgselect.c                                     |   16 +
 src/xsmfns.c                                       |    2 +-
 src/xterm.c                                        |  109 +-
 test/Makefile.in                                   |    5 +-
 test/README                                        |    8 +
 test/infra/Dockerfile.emba                         |   15 +
 test/infra/gitlab-ci.yml                           |  116 +-
 test/lisp/auth-source-pass-tests.el                |   24 +-
 test/lisp/calendar/iso8601-tests.el                |   10 +-
 test/lisp/custom-resources/custom--test-theme.el   |    4 +-
 test/lisp/custom-tests.el                          |  104 +
 .../emacs-lisp/bytecomp-resources/bc-test-alpha.el |    9 +
 .../emacs-lisp/bytecomp-resources/bc-test-beta.el  |    6 +
 test/lisp/emacs-lisp/bytecomp-tests.el             |   18 +
 test/lisp/emacs-lisp/copyright-tests.el            |    4 +
 test/lisp/emacs-lisp/edebug-tests.el               |   15 +-
 test/lisp/emacs-lisp/map-tests.el                  |   37 +
 test/lisp/emacs-lisp/rx-tests.el                   |   14 +
 test/lisp/emacs-lisp/shortdoc-tests.el             |   45 +
 test/lisp/emacs-lisp/subr-x-tests.el               |    7 +-
 test/lisp/filenotify-tests.el                      |    5 +-
 test/lisp/files-tests.el                           |   55 +-
 test/lisp/gnus/gnus-util-tests.el                  |   37 -
 test/lisp/gnus/message-tests.el                    |   29 +
 test/lisp/help-fns-tests.el                        |    6 +-
 test/lisp/help-tests.el                            |    5 +
 test/lisp/image-tests.el                           |    5 +-
 test/lisp/minibuffer-tests.el                      |  143 ++
 test/lisp/net/tramp-archive-tests.el               |  116 +-
 test/lisp/net/tramp-tests.el                       |  202 +-
 .../cperl-mode-resources/cperl-bug-22355.pl        |   14 +
 .../cperl-mode-resources/cperl-bug-23992.pl        |   10 +
 .../cperl-mode-resources/cperl-bug-25098.pl        |   21 +
 test/lisp/progmodes/cperl-mode-tests.el            |   86 +-
 test/lisp/progmodes/grep-tests.el                  |   69 +
 test/lisp/progmodes/octave-tests.el                |   49 +
 test/lisp/progmodes/project-tests.el               |   25 +
 test/lisp/progmodes/python-tests.el                |   24 +
 test/lisp/progmodes/xref-tests.el                  |   40 +-
 test/lisp/shadowfile-tests.el                      |    3 +
 test/lisp/subr-tests.el                            |   10 +
 test/lisp/textmodes/css-mode-tests.el              |   12 +-
 test/lisp/textmodes/sgml-mode-tests.el             |   27 +
 test/lisp/time-stamp-tests.el                      |  446 ++++-
 test/lisp/vc/diff-mode-tests.el                    |  142 ++
 test/manual/etags/CTAGS.good                       |   99 +-
 test/manual/etags/ETAGS.good_1                     | 1552 ++++++++-------
 test/manual/etags/ETAGS.good_2                     | 1631 ++++++++--------
 test/manual/etags/ETAGS.good_3                     | 1582 ++++++++--------
 test/manual/etags/ETAGS.good_4                     | 1888 ++++++++++---------
 test/manual/etags/ETAGS.good_5                     | 1977 +++++++++++---------
 test/manual/etags/ETAGS.good_6                     | 1977 +++++++++++---------
 test/manual/etags/Makefile                         |    4 +-
 test/manual/etags/README                           |   60 +
 test/manual/etags/merc-src/accumulator.m           | 1962 +++++++++++++++++++
 test/manual/etags/rs-src/test.rs                   |   14 +
 test/manual/indent/scss-mode.scss                  |    6 +-
 test/src/comp-tests.el                             |   14 +-
 test/src/emacs-module-tests.el                     |    4 +-
 test/src/emacs-resources/seccomp-filter-exec.bpf   |    1 -
 test/src/emacs-resources/seccomp-filter.bpf        |    1 -
 test/src/emacs-tests.el                            |   14 +-
 test/src/lread-tests.el                            |   67 +
 test/src/syntax-tests.el                           |   11 +
 461 files changed, 25175 insertions(+), 13172 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index 8d52cb5..97d954b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -96,14 +96,21 @@ NTDIR=@NTDIR@
 top_builddir = @top_builddir@
 -include ${top_builddir}/src/verbose.mk
 
+FIND_DELETE = @FIND_DELETE@
+
 HAVE_NATIVE_COMP = @HAVE_NATIVE_COMP@
 
+USE_STARTUP_NOTIFICATION = @USE_STARTUP_NOTIFICATION@
+
 # ==================== Where To Install Things ====================
 
 # Location to install Emacs.app under GNUstep / macOS.
 # Later values may use these.
+ns_appdir=@ns_appdir@
 ns_appbindir=@ns_appbindir@
+ns_applibexecdir=@ns_applibexecdir@
 ns_appresdir=@ns_appresdir@
+ns_applibdir=@ns_applibdir@
 # Either yes or no depending on whether this is a relocatable Emacs.app.
 ns_self_contained=@ns_self_contained@
 
@@ -183,8 +190,8 @@ x_default_search_path=@x_default_search_path@
 # Where the etc/emacs.desktop file is to be installed.
 desktopdir=$(datarootdir)/applications
 
-# Where the etc/emacs.appdata.xml file is to be installed.
-appdatadir=$(datarootdir)/metainfo
+# Where the etc/emacs.metainfo.xml file is to be installed.
+metainfodir=$(datarootdir)/metainfo
 
 # Where the etc/emacs.service file is to be installed.
 # The system value (typically /usr/lib/systemd/user) can be
@@ -326,12 +333,12 @@ BIN_DESTDIR='$(DESTDIR)${bindir}/'
 ELN_DESTDIR = $(DESTDIR)${libdir}/emacs/${version}/
 else
 BIN_DESTDIR='${ns_appbindir}/'
-ELN_DESTDIR = ${ns_appresdir}/
+ELN_DESTDIR = ${ns_applibdir}/
 endif
 
 all: ${SUBDIR} info
 
-.PHONY: all ${SUBDIR} blessmail epaths-force epaths-force-w32 etc-emacsver
+.PHONY: all ${SUBDIR} blessmail epaths-force epaths-force-w32 
epaths-force-ns-self-contained etc-emacsver
 
 # If configure were to just generate emacsver.tex from emacsver.tex.in
 # in the normal way, the timestamp of emacsver.tex would always be
@@ -400,6 +407,17 @@ epaths-force-w32:
          -e "/^.*#/s|@SRC@|$${w32srcdir}|g") &&                \
        ${srcdir}/build-aux/move-if-change epaths.h.$$$$ src/epaths.h
 
+# A NextStep style app bundle is relocatable, so instead of
+# hard-coding paths try to generate them at run-time.
+#
+# The paths are mostly the same, and the bundle paths are different
+# between macOS and GNUstep, so just replace any references to the app
+# bundle root itself with the relative path.
+epaths-force-ns-self-contained: epaths-force
+       @(sed < src/epaths.h > epaths.h.$$$$            \
+         -e 's;${ns_appdir}/;;') &&                    \
+       ${srcdir}/build-aux/move-if-change epaths.h.$$$$ src/epaths.h
+
 lib-src src: $(NTDIR) lib
 
 src: lib-src
@@ -704,11 +722,15 @@ install-man:
 ## Note: emacs22 does not have all the resolutions.
 EMACS_ICON=emacs
 
+ifeq (${USE_STARTUP_NOTIFICATION},no)
+USE_STARTUP_NOTIFICATION_SED_CMD=-e "/^StartupNotify=true$$/d"
+endif
 install-etc:
        umask 022; ${MKDIR_P} "$(DESTDIR)${desktopdir}"
        tmp=etc/emacs.tmpdesktop; rm -f $${tmp}; \
        sed -e "/^Exec=emacs/ s/emacs/${EMACS_NAME}/" \
          -e "/^Icon=emacs/ s/emacs/${EMACS_NAME}/" \
+         $(USE_STARTUP_NOTIFICATION_SED_CMD) \
          ${srcdir}/etc/emacs.desktop > $${tmp}; \
        ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${desktopdir}/${EMACS_NAME}.desktop"; \
        rm -f $${tmp}
@@ -716,14 +738,28 @@ install-etc:
        client_name=`echo emacsclient | sed '$(TRANSFORM)'`${EXEEXT}; \
        sed -e "/^Exec=emacsclient/ s|emacsclient|${bindir}/$${client_name}|" \
          -e "/^Icon=emacs/ s/emacs/${EMACS_NAME}/" \
+         $(USE_STARTUP_NOTIFICATION_SED_CMD) \
          ${srcdir}/etc/emacsclient.desktop > $${tmp}; \
        ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${desktopdir}/$${client_name}.desktop"; \
        rm -f $${tmp}
-       umask 022; ${MKDIR_P} "$(DESTDIR)${appdatadir}"
-       tmp=etc/emacs.tmpappdata; rm -f $${tmp}; \
+       tmp=etc/emacs-mail.tmpdesktop; rm -f $${tmp}; \
+       sed -e "/^Exec=emacs/ s/emacs/${EMACS_NAME}/" \
+         -e "/^Icon=emacs/ s/emacs/${EMACS_NAME}/" \
+         ${srcdir}/etc/emacs-mail.desktop > $${tmp}; \
+       ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${desktopdir}/${EMACS_NAME}-mail.desktop"; \
+       rm -f $${tmp}
+       tmp=etc/emacsclient-mail.tmpdesktop; rm -f $${tmp}; \
+       client_name=`echo emacsclient | sed '$(TRANSFORM)'`${EXEEXT}; \
+       sed -e "/^Exec=emacsclient/ s|emacsclient|${bindir}/$${client_name}|" \
+         -e "/^Icon=emacs/ s/emacs/${EMACS_NAME}/" \
+         ${srcdir}/etc/emacsclient-mail.desktop > $${tmp}; \
+       ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${desktopdir}/$${client_name}-mail.desktop"; \
+       rm -f $${tmp}
+       umask 022; ${MKDIR_P} "$(DESTDIR)${metainfodir}"
+       tmp=etc/emacs.tmpmetainfo; rm -f $${tmp}; \
        sed -e "s/emacs\.desktop/${EMACS_NAME}.desktop/" \
-         ${srcdir}/etc/emacs.appdata.xml > $${tmp}; \
-       ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${appdatadir}/${EMACS_NAME}.appdata.xml"; \
+         ${srcdir}/etc/emacs.metainfo.xml > $${tmp}; \
+       ${INSTALL_DATA} $${tmp} 
"$(DESTDIR)${metainfodir}/${EMACS_NAME}.metainfo.xml"; \
        rm -f $${tmp}
        umask 022; $(MKDIR_P) "$(DESTDIR)$(systemdunitdir)"
        tmp=etc/emacs.tmpservice; rm -f $${tmp}; \
@@ -751,7 +787,7 @@ install-etc:
        done
 
 ### Install native compiled Lisp files.
-install-eln:
+install-eln: lisp
 ifeq ($(HAVE_NATIVE_COMP),yes)
        find native-lisp -type d -exec $(MKDIR_P) "$(ELN_DESTDIR){}" \; ; \
        find native-lisp -type f -exec ${INSTALL_DATA} "{}" "$(ELN_DESTDIR){}" 
\;
@@ -809,7 +845,7 @@ uninstall: uninstall-$(NTDIR) uninstall-doc
             "hicolor/scalable/mimetypes/${EMACS_NAME}-document23.svg"; \
        fi)
        -rm -f "$(DESTDIR)${desktopdir}/${EMACS_NAME}.desktop"
-       -rm -f "$(DESTDIR)${appdatadir}/${EMACS_NAME}.appdata.xml"
+       -rm -f "$(DESTDIR)${metainfodir}/${EMACS_NAME}.metainfo.xml"
        -rm -f "$(DESTDIR)$(systemdunitdir)/${EMACS_NAME}.service"
   ifneq (,$(use_gamedir))
        for file in snake-scores tetris-scores; do \
@@ -843,12 +879,11 @@ endef
 ###      target for GCC does not delete 'libgcc.a', because recompiling it
 ###      is rarely necessary and takes a lot of time.
 mostlyclean_dirs = src oldXMenu lwlib lib lib-src nt doc/emacs doc/misc \
-  doc/lispref doc/lispintro
+  doc/lispref doc/lispintro test
 
 $(foreach dir,$(mostlyclean_dirs),$(eval $(call 
submake_template,$(dir),mostlyclean)))
 
 mostlyclean: $(mostlyclean_dirs:=_mostlyclean)
-       [ ! -d test ] || $(MAKE) -C test $@
 
 ### 'clean'
 ###      Delete all files from the current directory that are normally
@@ -863,7 +898,6 @@ clean_dirs = $(mostlyclean_dirs) nextstep admin/charsets 
admin/unidata
 $(foreach dir,$(clean_dirs),$(eval $(call submake_template,$(dir),clean)))
 
 clean: $(clean_dirs:=_clean)
-       [ ! -d test ] || $(MAKE) -C test $@
        -rm -f ./*.tmp etc/*.tmp*
        -rm -rf info-dir.*
        -rm -rf native-lisp
@@ -889,7 +923,6 @@ distclean_dirs = $(clean_dirs) leim lisp admin/grammars
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),distclean)))
 
 distclean: $(distclean_dirs:=_distclean)
-       [ ! -d test ] || $(MAKE) -C test $@
        ${top_distclean}
 
 ### 'bootstrap-clean'
@@ -898,7 +931,6 @@ distclean: $(distclean_dirs:=_distclean)
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),bootstrap-clean)))
 
 bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
-       [ ! -d test ] || $(MAKE) -C test $@
        [ ! -f config.log ] || mv -f config.log config.log~
        rm -rf ${srcdir}/info
        rm -f ${srcdir}/etc/refcards/emacsver.tex
@@ -917,34 +949,25 @@ bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
 ###      begin to build the program.
 top_maintainer_clean=\
        ${top_distclean}; \
-       rm -fr autom4te.cache
-
-maintainer_clean_dirs = src leim lisp admin/charsets admin/grammars \
-  admin/unidata
+       rm -fr ${srcdir}/autom4te.cache
 
-$(foreach dir,$(maintainer_clean_dirs),$(eval $(call 
submake_template,$(dir),maintainer-clean)))
+$(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),maintainer-clean)))
 
-maintainer-clean: bootstrap-clean $(maintainer_clean_dirs:=_maintainer-clean)
-       [ ! -d test ] || $(MAKE) -C test $@
+maintainer-clean: $(distclean_dirs:=_maintainer-clean)
+       rm -rf ${srcdir}/info
+       rm -f ${srcdir}/etc/refcards/emacsver.tex
        ${top_maintainer_clean}
 
 ### This doesn't actually appear in the coding standards, but Karl
 ### says GCC supports it, and that's where the configuration part of
 ### the coding standards seem to come from.  It's like distclean, but
 ### it deletes backup and autosave files too.
-### Note that we abuse this in some subdirectories (eg leim),
-### to delete some generated files that are slow to rebuild.
-extraclean_dirs = ${NTDIR} lib-src src leim \
-  admin/charsets admin/grammars admin/unidata lisp lib lwlib
-
-$(foreach dir,$(extraclean_dirs),$(eval $(call 
submake_template,$(dir),extraclean)))
-
-extraclean: $(extraclean_dirs:=_extraclean)
-       ${top_maintainer_clean}
-       -rm -f config-tmp-* aclocal.m4 configure
-       -rm -f ./*~ \#* etc/refcards/emacsver.tex doc/emacs/emacsver.texi
-       -rm -f info/*.info info/dir
-       -rmdir info 2>/dev/null
+extraclean: maintainer-clean
+       -rm -f config-tmp-* ${srcdir}/aclocal.m4 ${srcdir}/configure \
+         ${srcdir}/src/config.in
+       -[ "${srcdir}" = "." ] || \
+         find ${srcdir} '(' -name '*~' -o -name '#*' ')' ${FIND_DELETE}
+       -find . '(' -name '*~' -o -name '#*' ')' ${FIND_DELETE}
 
 # The src subdir knows how to do the right thing
 # even when the build directory and source dir are different.
@@ -961,12 +984,7 @@ TAGS tags: lib lib-src # src
 CHECK_TARGETS = check check-maybe check-expensive check-all
 .PHONY: $(CHECK_TARGETS)
 $(CHECK_TARGETS): all
-ifeq ($(wildcard test),test)
        $(MAKE) -C test $@
-else
-       @echo "You do not seem to have the test/ directory."
-       @echo "Maybe you used a release tarfile that lacks tests."
-endif
 
 test/%:
        $(MAKE) -C test $*
diff --git a/admin/charsets/Makefile.in b/admin/charsets/Makefile.in
index 0042484..f043077 100644
--- a/admin/charsets/Makefile.in
+++ b/admin/charsets/Makefile.in
@@ -297,7 +297,7 @@ ${charsetdir}/%.map: ${GLIBC_CHARMAPS}/%.gz ${mapconv} 
${compact}
        ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x/' GLIBC-1 ${compact} > $@
 
 
-.PHONY: clean bootstrap-clean distclean maintainer-clean extraclean gen-clean
+.PHONY: clean bootstrap-clean distclean maintainer-clean gen-clean
 
 clean:
 
@@ -312,4 +312,3 @@ gen-clean:
 
 maintainer-clean: gen-clean distclean
 
-extraclean: maintainer-clean
diff --git a/admin/emake b/admin/emake
index 834a184..bdaabc0 100755
--- a/admin/emake
+++ b/admin/emake
@@ -27,19 +27,21 @@ s#^Configuring local git # Configuring local git #
 s#^Installing git hooks...# Installing git hooks...#
 s#^Running # Running #
 s#^Configured for # Configured for #
-s#^./temacs # ./temacs #
-s#^Dumping under the name# Dumping under the name#
+s#^./temacs.*#  \\& #
 ' | \
 egrep --line-buffered -v "^make|\
 ^Loading|\
 SCRAPE|\
-INFO.*Scraping.*[.]\$|\
+INFO.*Scraping.*[.] ?\$|\
+INFO.*Scraping.*done\$|\
+GEN.*etc/DOC|\
 ^Waiting for git|\
 ^Finding pointers|\
 ^Using load-path|\
 ^Adding name|\
 ^Dump mode|\
 ^Dumping finger|\
+^Dumping under the name|\
 ^Byte counts|\
 ^Reloc counts|\
 ^Pure-hashed|\
diff --git a/admin/grammars/Makefile.in b/admin/grammars/Makefile.in
index 4172411..aaf95c0 100644
--- a/admin/grammars/Makefile.in
+++ b/admin/grammars/Makefile.in
@@ -95,7 +95,7 @@ ${cedetdir}/srecode/srt-wy.el: ${srcdir}/srecode-template.wy 
${grammar_wisent}
        $(AM_V_GEN)[ ! -f "$@" ] || chmod +w "$@"
        $(AM_V_at)${make_wisent} -o "$@" $<
 
-.PHONY: distclean bootstrap-clean maintainer-clean extraclean gen-clean
+.PHONY: distclean bootstrap-clean maintainer-clean gen-clean
 
 distclean:
        rm -f Makefile
@@ -108,7 +108,6 @@ gen-clean:
 
 maintainer-clean: gen-clean distclean
 
-extraclean: maintainer-clean
 
 
 # Makefile.in ends here
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 2f763a5..ae007d76 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -268,6 +268,7 @@ The pages to update are:
 emacs.html (for a new major release, a more thorough update is needed)
 history.html
 add the new NEWS file as news/NEWS.xx.y
+Copy new etc/MACHINES to MACHINES and CONTRIBUTE to CONTRIBUTE
 
 For every new release, a banner is displayed on top of the emacs.html
 page.  Uncomment and the release banner in emacs.html.  Keep it on the
diff --git a/admin/notes/years b/admin/notes/years
index b56d94a..19c72c3 100644
--- a/admin/notes/years
+++ b/admin/notes/years
@@ -5,6 +5,12 @@ rolls around, add that year to every FSF (and AIST) copyright 
notice.
 Do this by running the 'admin/update-copyright' script on a fresh repo
 checkout.  Inspect the results for plausibility, then commit them.
 
+You should also run the etags test suite in test/manual/etags/.  It
+will most probably fail because the contents of the test files changes
+due to copyright years update, so you need to move each ETAGS and
+CTAGS file produced by the test runs into the corresponding
+ETAGS.good* and CTAGS.good files, and then commit the new test files.
+
 There's no need to worry about whether an individual file has changed
 in a given year - it's sufficient that Emacs as a whole has changed.
 
diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in
index b7a927d..357b812 100644
--- a/admin/unidata/Makefile.in
+++ b/admin/unidata/Makefile.in
@@ -85,7 +85,7 @@ ${unidir}/charscript.el: ${srcdir}/Blocks.txt ${blocks}
        $(AM_V_GEN)$(AWK) -f ${blocks} < $< > $@
 
 
-.PHONY: clean bootstrap-clean distclean maintainer-clean extraclean gen-clean
+.PHONY: clean bootstrap-clean distclean maintainer-clean gen-clean
 
 clean:
        rm -f ${srcdir}/*.elc unidata.txt
@@ -107,4 +107,3 @@ gen-clean:
 
 maintainer-clean: gen-clean distclean
 
-extraclean: maintainer-clean
diff --git a/configure.ac b/configure.ac
index 3df4359..c924634 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1891,10 +1891,11 @@ if test "${with_ns}" != no; then
   # so avoid NS_IMPL_COCOA if macuvs.h is absent.
   # Even a headless Emacs can build macuvs.h, so this should let you bootstrap.
   if test "${opsys}" = darwin && test -f "$srcdir/src/macuvs.h"; then
-     lispdirrel=Contents/Resources/lisp
      NS_IMPL_COCOA=yes
      ns_appdir=`pwd`/nextstep/Emacs.app
      ns_appbindir=${ns_appdir}/Contents/MacOS
+     ns_applibexecdir=${ns_appdir}/Contents/MacOS/libexec
+     ns_applibdir=${ns_appdir}/Contents/Frameworks
      ns_appresdir=${ns_appdir}/Contents/Resources
      ns_appsrc=Cocoa/Emacs.base
      ns_fontfile=macfont.o
@@ -1952,6 +1953,8 @@ fail;
   if test $NS_IMPL_GNUSTEP = yes; then
      ns_appdir=`pwd`/nextstep/Emacs.app
      ns_appbindir=${ns_appdir}
+     ns_applibexecdir=${ns_appdir}/libexec
+     ns_applibdir=${ns_appdir}/Frameworks
      ns_appresdir=${ns_appdir}/Resources
      ns_appsrc=GNUstep/Emacs.base
      ns_fontfile=nsfont.o
@@ -2008,12 +2011,13 @@ if test "${HAVE_NS}" = yes; then
   window_system=nextstep
   # set up packaging dirs
   if test "${EN_NS_SELF_CONTAINED}" = yes; then
+     AC_DEFINE(NS_SELF_CONTAINED, 1, [Build an NS bundled app])
      ns_self_contained=yes
      prefix=${ns_appresdir}
      exec_prefix=${ns_appbindir}
      dnl This one isn't really used, only archlibdir is.
-     libexecdir="\${ns_appbindir}/libexec"
-     archlibdir="\${ns_appbindir}/libexec"
+     libexecdir="\${ns_applibexecdir}"
+     archlibdir="\${ns_applibexecdir}"
      etcdocdir="\${ns_appresdir}/etc"
      etcdir="\${ns_appresdir}/etc"
      dnl FIXME maybe set datarootdir instead.
@@ -2021,7 +2025,8 @@ if test "${HAVE_NS}" = yes; then
      infodir="\${ns_appresdir}/info"
      mandir="\${ns_appresdir}/man"
      lispdir="\${ns_appresdir}/lisp"
-     test "$locallisppathset" = no && locallisppath=""
+     lispdirrel="\${ns_appresdir}/lisp"
+     test "$locallisppathset" = no && 
locallisppath="\${ns_appresdir}/site-lisp"
      INSTALL_ARCH_INDEP_EXTRA=
   fi
 
@@ -2273,6 +2278,9 @@ doug_lea_malloc=$emacs_cv_var_doug_lea_malloc
 hybrid_malloc=
 system_malloc=yes
 
+dnl This must be before the test of $ac_cv_func_sbrk below.
+AC_CHECK_FUNCS_ONCE([sbrk])
+
 test $with_unexec = yes &&
 case "$opsys" in
   ## darwin ld insists on the use of malloc routines in the System framework.
@@ -2889,6 +2897,11 @@ fi
 AC_SUBST(SETTINGS_CFLAGS)
 AC_SUBST(SETTINGS_LIBS)
 
+USE_STARTUP_NOTIFICATION=no
+if test "${HAVE_GTK}" = "yes"; then
+    USE_STARTUP_NOTIFICATION=yes
+fi
+AC_SUBST(USE_STARTUP_NOTIFICATION)
 
 dnl SELinux is available for GNU/Linux only.
 HAVE_LIBSELINUX=no
@@ -3769,27 +3782,28 @@ AC_DEFUN([libgccjit_smoke_test], [
       }]])])
 
 AC_DEFUN([libgccjit_not_found], [
-  AC_MSG_ERROR([elisp native compiler requested but libgccjit not found.
-Please try installing libgccjit or similar package.
-If you are sure you want Emacs compiled without elisp native compiler, pass
-  --without-native-compilation
-to configure.])])
+  AC_MSG_ERROR([ELisp native compiler was requested, but libgccjit was not 
found.
+Please try installing libgccjit or a similar package.
+If you are sure you want Emacs be compiled without ELisp native compiler,
+pass the --without-native-compilation option to configure.])])
 
 AC_DEFUN([libgccjit_dev_not_found], [
-  AC_MSG_ERROR([elisp native compiler requested but libgccjit header files were
+  AC_MSG_ERROR([ELisp native compiler was requested, but libgccjit header 
files were
 not found.
-Please try installing libgccjit-dev or similar package.
-If you are sure you want Emacs compiled without elisp native compiler, pass
---without-nativecomp
-to configure.])])
+Please try installing libgccjit-dev or a similar package.
+If you are sure you want Emacs be compiled without ELisp native compiler,
+pass the --without-nativecomp option to configure.])])
 
 AC_DEFUN([libgccjit_broken], [
-  AC_MSG_ERROR([Installed libgccjit has failed passing the smoke test.
-You can verify it yourself compiling:
+  AC_MSG_ERROR([The installed libgccjit failed to compile and run a test 
program using
+the libgccjit library; see config.log for the details of the failure.
+The test program can be found here:
 <https://gcc.gnu.org/onlinedocs/jit/intro/tutorial01.html>.
-Please report the issue to your distribution if libgccjit was installed through
-that.
-Here instructions on how to compile and install libgccjit from source:
+You can try compiling it yourself to investigate the issues.
+Please report the issue to your distribution if libgccjit was installed
+through that.
+You can find the instructions on how to compile and install libgccjit from
+source on this site:
 <https://gcc.gnu.org/wiki/JIT>.])])
 
 HAVE_NATIVE_COMP=no
@@ -4677,7 +4691,7 @@ AC_CHECK_HEADERS(valgrind/valgrind.h)
 
 AC_CHECK_MEMBERS([struct unipair.unicode], [], [], [[#include <linux/kd.h>]])
 
-AC_CHECK_FUNCS_ONCE([__lsan_ignore_object sbrk])
+AC_CHECK_FUNCS_ONCE([__lsan_ignore_object])
 
 AC_FUNC_FORK
 
@@ -5405,6 +5419,8 @@ AC_SUBST(CFLAGS)
 AC_SUBST(X_TOOLKIT_TYPE)
 AC_SUBST(ns_appdir)
 AC_SUBST(ns_appbindir)
+AC_SUBST(ns_applibexecdir)
+AC_SUBST(ns_applibdir)
 AC_SUBST(ns_appresdir)
 AC_SUBST(ns_appsrc)
 AC_SUBST(GNU_OBJC_CFLAGS)
@@ -6005,10 +6021,13 @@ dnl the use of force in the 'epaths-force' rule in 
Makefile.in.
 AC_CONFIG_COMMANDS([src/epaths.h], [
 if test "${opsys}" = "mingw32"; then
   ${MAKE-make} MAKEFILE_NAME=do-not-make-Makefile epaths-force-w32
+elif test "$HAVE_NS" = "yes" && test "$EN_NS_SELF_CONTAINED" = "yes"; then
+  ${MAKE-make} MAKEFILE_NAME=do-not-make-Makefile 
epaths-force-ns-self-contained
 else
   ${MAKE-make} MAKEFILE_NAME=do-not-make-Makefile epaths-force
 fi || AC_MSG_ERROR(['src/epaths.h' could not be made.])
-], [GCC="$GCC" CPPFLAGS="$CPPFLAGS" opsys="$opsys"])
+], [GCC="$GCC" CPPFLAGS="$CPPFLAGS" opsys="$opsys" HAVE_NS="$HAVE_NS"
+    EN_NS_SELF_CONTAINED="$EN_NS_SELF_CONTAINED"])
 
 dnl NB we have to cheat and use the ac_... version because abs_top_srcdir
 dnl is not yet set, sigh.  Or we could use ../$srcdir/src/.gdbinit,
diff --git a/doc/emacs/basic.texi b/doc/emacs/basic.texi
index 4a34fd3..ba8d822 100644
--- a/doc/emacs/basic.texi
+++ b/doc/emacs/basic.texi
@@ -112,7 +112,7 @@ just like digits.  Case is ignored.
 @cindex curly quotes, inserting
 @cindex curved quotes, inserting
   A few common Unicode characters can be inserted via a command
-starting with @kbd{C-x 8}.  For example, @kbd{C-x 8 [} inserts @t{‘}
+starting with @w{@kbd{C-x 8}}.  For example, @kbd{C-x 8 [} inserts @t{‘}
 which is Unicode code-point U+2018 @sc{left single quotation mark},
 sometimes called a left single ``curved quote'' or ``curly quote''.
 Similarly, @w{@kbd{C-x 8 ]}}, @kbd{C-x 8 @{} and @kbd{C-x 8 @}} insert the
@@ -895,4 +895,7 @@ Currently supported shorter key sequences are @kbd{C-x u u} 
instead of
 v v} to resize the selected window interactively, @kbd{M-g n n p p} to
 navigate @code{next-error} matches.  Any other key exits transient mode
 and then is executed normally.  The user option @code{repeat-exit-key}
-defines an additional key to exit this transient mode.
+defines an additional key to exit this transient mode.  Also it's
+possible to break the repetition chain automatically after idle time
+by customizing the user option @code{repeat-exit-timeout} to a number
+of seconds.
diff --git a/doc/emacs/building.texi b/doc/emacs/building.texi
index 7194eb9..8de9386 100644
--- a/doc/emacs/building.texi
+++ b/doc/emacs/building.texi
@@ -1486,6 +1486,13 @@ Emacs Lisp code goes in a separate file whose name ends 
in
 @file{foo.elc}.  @xref{Byte Compilation,, Byte Compilation, elisp, the
 Emacs Lisp Reference Manual}.
 
+@cindex native compilation
+  Emacs Lisp code can also be compiled into @dfn{native code}: machine
+code not unlike the one produced by a C or Fortran compiler.  Native
+code runs even faster than byte-code.  Natively-compiled Emacs Lisp
+code is stored in files whose names end in @samp{.eln}.  @xref{Native
+Compilation,, Byte Compilation, elisp, the Emacs Lisp Reference Manual}.
+
 @findex load-file
   To @dfn{load} an Emacs Lisp file, type @kbd{M-x load-file}.  This
 command reads a file name using the minibuffer, and executes the
diff --git a/doc/emacs/dired.texi b/doc/emacs/dired.texi
index f57606d..3625703 100644
--- a/doc/emacs/dired.texi
+++ b/doc/emacs/dired.texi
@@ -862,21 +862,24 @@ Compress the specified files (@code{dired-do-compress}).  
If the file
 appears to be a compressed file already, uncompress it instead.  Each
 marked file is compressed into its own archive; this uses the
 @command{gzip} program if it is available, otherwise it uses
-@command{compress}.  On a directory name, this command produces a
-compressed @file{.tar.gz} archive containing all of the directory's
-files, by running the @command{tar} command with output piped to
-@command{gzip}.  To allow decompression of compressed directories,
-typing @kbd{Z} on a @file{.tar.gz} or @file{.tgz} archive file unpacks
-all the files in the archive into a directory whose name is the
-archive name with the extension removed.
+@command{compress}.
+
+On a directory name, this command produces a compressed archive
+depending on the @code{dired-compress-directory-default-suffix} user
+option.  The default is a @file{.tar.gz} archive containing all of the
+directory's files, by running the @command{tar} command with output
+piped to @command{gzip}.  To allow decompression of compressed
+directories, typing @kbd{Z} on a @file{.tar.gz} or @file{.tgz} archive
+file unpacks all the files in the archive into a directory whose name
+is the archive name with the extension removed.
 
 @findex dired-do-compress-to
 @kindex c @r{(Dired)}
 @item c
 Compress the specified files (@code{dired-do-compress-to}) into a
-single archive anywhere on the file system. The compression algorithm
-is determined by the extension of the archive, see
-@code{dired-compress-files-alist}.
+single archive anywhere on the file system.  The default archive is
+controlled by the @code{dired-compress-directory-default-suffix} user
+option.  Also see @code{dired-compress-files-alist}.
 
 @findex epa-dired-do-decrypt
 @kindex :d @r{(Dired)}
diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
index 58d08b4..f6c422a 100644
--- a/doc/emacs/display.texi
+++ b/doc/emacs/display.texi
@@ -1189,8 +1189,8 @@ that has some special meaning for formatting the source 
code of a
 program.
 
   To activate the fill-column indication display, use the minor modes
-@w{@kbd{M-x display-fill-column-indicator-mode}} and
-@w{@kbd{M-x global-display-fill-column-indicator-mode}}, which enable
+@kbd{M-x display-fill-@-column-indicator-mode} and
+@kbd{M-x global-display-fill-column-indicator-mode}, which enable
 the indicator locally or globally, respectively.
 
 Alternatively, you can set the two buffer-local variables
@@ -1220,8 +1220,8 @@ The value @code{nil} disables the indicator.  When the 
mode is enabled
 through the functions @code{display-fill-column-indicator-mode} or
 @code{global-display-fill-column-indicator-mode}, they will use the
 character specified by this variable, if it is non-@code{nil};
-otherwise Emacs will use the character @samp{U+2502 VERTICAL LINE},
-falling back to @samp{|} if @code{U+2502} cannot be displayed.
+otherwise Emacs will use the character U+2502 @sc{box drawings light vertical},
+falling back to @samp{|} if U+2502 cannot be displayed.
 
 @item fill-column-indicator
 @vindex fill-column-indicator
@@ -1577,8 +1577,8 @@ characters, as well as many non-@acronym{ASCII} 
characters.
 @cindex control characters on display
   The @acronym{ASCII} character set contains non-printing @dfn{control
 characters}.  Two of these are displayed specially: the newline
-character (Unicode code point @code{U+000A}) is displayed by starting
-a new line, while the tab character (@code{U+0009}) is displayed as a
+character (Unicode code point U+000A) is displayed by starting
+a new line, while the tab character (U+0009) is displayed as a
 space that extends to the next tab stop column (normally every 8
 columns).  The number of spaces per tab is controlled by the
 buffer-local variable @code{tab-width}, which must have an integer
@@ -1587,17 +1587,17 @@ character in the buffer is displayed has nothing to do 
with the
 definition of @key{TAB} as a command.
 
   Other @acronym{ASCII} control characters, whose codes are below
-@code{U+0020} (octal 40, decimal 32), are displayed as a caret
+U+0020 (octal 40, decimal 32), are displayed as a caret
 (@samp{^}) followed by the non-control version of the character, with
 the @code{escape-glyph} face.  For instance, the @samp{control-A}
-character, @code{U+0001}, is displayed as @samp{^A}.
+character, U+0001, is displayed as @samp{^A}.
 
 @cindex octal escapes
 @vindex ctl-arrow
-  The raw bytes with codes @code{U+0080} (octal 200) through
-@code{U+009F} (octal 237) are displayed as @dfn{octal escape
+  The raw bytes with codes U+0080 (octal 200) through
+U+009F (octal 237) are displayed as @dfn{octal escape
 sequences}, with the @code{escape-glyph} face.  For instance,
-character code @code{U+0098} (octal 230) is displayed as @samp{\230}.
+character code U+0098 (octal 230) is displayed as @samp{\230}.
 If you change the buffer-local variable @code{ctl-arrow} to
 @code{nil}, the @acronym{ASCII} control characters are also displayed
 as octal escape sequences instead of caret escape sequences.  (You can
@@ -1616,11 +1616,11 @@ can cause problems if they are entered into a buffer 
without your
 realization, e.g., by yanking; for instance, source code compilers
 typically do not treat non-@acronym{ASCII} spaces as whitespace
 characters.  To deal with this problem, Emacs displays such characters
-specially: it displays @code{U+00A0} (no-break space) and other
+specially: it displays U+00A0 @sc{no-break space} and other
 characters from the Unicode horizontal space class with the
-@code{nobreak-space} face, and it displays @code{U+00AD} (soft
-hyphen), @code{U+2010} (hyphen), and @code{U+2011} (non-breaking
-hyphen) with the @code{nobreak-hyphen} face.  To disable this, change
+@code{nobreak-space} face, and it displays U+00AD @sc{soft
+hyphen}, U+2010 @sc{hyphen}, and U+2011 @sc{non-breaking
+hyphen} with the @code{nobreak-hyphen} face.  To disable this, change
 the variable @code{nobreak-char-display} to @code{nil}.  If you give
 this variable a non-@code{nil} and non-@code{t} value, Emacs instead
 displays such characters as a highlighted backslash followed by a
@@ -1649,10 +1649,10 @@ for details.
 @cindex curved quotes, and terminal capabilities
 @cindex @code{homoglyph} face
 
-Emacs tries to determine if the curved quotes @samp{‘} and @samp{’}
+Emacs tries to determine if the curved quotes @t{‘} and @t{’}
 can be displayed on the current display.  By default, if this seems to
-be so, then Emacs will translate the @acronym{ASCII} quotes (@samp{`}
-and @samp{'}), when they appear in messages and help texts, to these
+be so, then Emacs will translate the @acronym{ASCII} quotes @w{(@samp{`}
+and @samp{'})}, when they appear in messages and help texts, to these
 curved quotes.  You can influence or inhibit this translation by
 customizing the user option @code{text-quoting-style} (@pxref{Keys in
 Documentation,,, elisp, The Emacs Lisp Reference Manual}).
@@ -1661,7 +1661,7 @@ Documentation,,, elisp, The Emacs Lisp Reference Manual}).
 known to look just like @acronym{ASCII} characters, they are shown
 with the @code{homoglyph} face.  Curved quotes that are known not to
 be displayable are shown as their @acronym{ASCII} approximations
-@t{`}, @t{'}, and @t{"} with the @code{homoglyph} face.
+@samp{`}, @samp{'}, and @samp{"} with the @code{homoglyph} face.
 
 @node Cursor Display
 @section Displaying the Cursor
@@ -1829,15 +1829,15 @@ variable @code{visual-line-fringe-indicators}.
 That produces incorrect results when CJK and Latin text are mixed
 together (because CJK characters don't use whitespace to separate
 words).  You can customize the option @code{word-wrap-by-category} to
-allow Emacs to break lines after any character with ``|'' category
+allow Emacs to break lines after any character with @samp{|} category
 (@pxref{Categories,,, elisp, the Emacs Lisp Reference Manual}), which
 provides better support for CJK characters.  Also, if this variable is
 set using Customize, Emacs automatically loads @file{kinsoku.el}.
 When @file{kinsoku.el} is loaded, Emacs respects kinsoku rules when
-breaking lines.  That means characters with the ``>'' category don't
-appear at the beginning of a line (e.g., U+FF0C FULLWIDTH COMMA), and
-characters with the ``<'' category don't appear at the end of a line
-(e.g., U+300A LEFT DOUBLE ANGLE BRACKET).  You can view the category
+breaking lines.  That means characters with the @samp{>} category don't
+appear at the beginning of a line (e.g., U+FF0C @sc{fullwidth comma}), and
+characters with the @samp{<} category don't appear at the end of a line
+(e.g., U+300A @sc{left double angle bracket}).  You can view the category
 set of a character using the commands @code{char-category-set} and
 @code{category-set-mnemonics}, or by typing @kbd{C-u C-x =} with point
 on the character and looking at the ``category'' section in the
diff --git a/doc/emacs/docstyle.texi b/doc/emacs/docstyle.texi
index 5bdcd07..e740439 100644
--- a/doc/emacs/docstyle.texi
+++ b/doc/emacs/docstyle.texi
@@ -15,4 +15,5 @@
 @hyphenation{work-a-round}
 @hyphenation{work-a-rounds}
 @hyphenation{un-marked}
+@hyphenation{dic-tion-ary}
 @end iftex
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index 590dc42..9f64456 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -99,6 +99,7 @@ Cover art by Etienne Suvasa; cover design by Matt Lee.
 
 @end titlepage
 
+@headings double
 
 @summarycontents
 @contents
@@ -794,6 +795,8 @@ Maintaining Large Programs
 @ifnottex
 * Emerge::              A convenient way of merging two versions of a program.
 @end ifnottex
+* Bug Reference::       Highlighting references to bug reports and browsing
+                          them in their issue trackers.
 
 Version Control
 
diff --git a/doc/emacs/fixit.texi b/doc/emacs/fixit.texi
index 6b41849..b558ebc 100644
--- a/doc/emacs/fixit.texi
+++ b/doc/emacs/fixit.texi
@@ -263,6 +263,13 @@ systems.
 @xref{Top, Aspell,, aspell, The Aspell Manual}.
 @end ifnottex
 
+@vindex ispell-program-name
+  If you have only one of the spelling checker programs installed,
+Emacs will find it when you invoke for the first time one of the
+commands described here.  If you have more than one of them installed,
+you can control which one is used by customizing the variable
+@code{ispell-program-name}.
+
 @table @kbd
 @item M-$
 Check and correct spelling of the word at point (@code{ispell-word}).
@@ -365,7 +372,7 @@ Like @kbd{i}, but you can also specify dictionary completion
 information.
 
 @item u
-Insert the lower-case version of this word in your private dic@-tion@-ary
+Insert the lower-case version of this word in your private dictionary
 file.
 
 @item l @var{word} @key{RET}
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index e1a4e64..70615f6 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -614,7 +614,10 @@ If you are running Emacs on the GNOME desktop, you can 
tell Emacs to
 use the default system font by setting the variable
 @code{font-use-system-font} to @code{t} (the default is @code{nil}).
 For this to work, Emacs must have been compiled with support for
-Gsettings (or the older Gconf).
+Gsettings (or the older Gconf).  (To be specific, the Gsettings
+configuration names used are
+@samp{org.gnome.desktop.interface monospace-font-name} and
+@samp{org.gnome.desktop.interface font-name}.)
 
 @item
 Use the command line option @samp{-fn} (or @samp{--font}).  @xref{Font
diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 81cdeb4..0caab68 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -107,8 +107,8 @@ Display the @file{*Messages*} buffer
 (@code{view-echo-area-messages}).  @xref{Misc Help}.
 @item C-h f @var{function} @key{RET}
 Display documentation on the Lisp function named @var{function}
-(@code{describe-function}).  Since commands are Lisp functions,
-this works for commands too.  @xref{Name Help}.
+(@code{describe-function}).  Since commands are Lisp functions, this
+works for commands too, but you can also use @code{C-h x}.  @xref{Name Help}.
 @item C-h h
 Display the @file{HELLO} file, which shows examples of various character
 sets.
@@ -154,6 +154,9 @@ Display the documentation of the Lisp variable @var{var}
 @item C-h w @var{command} @key{RET}
 Show which keys run the command named @var{command} (@code{where-is}).
 @xref{Key Help}.
+@item C-h x @var{command} @key{RET}
+Display documentation on the named @var{command}
+(@code{describe-command}).  @xref{Name Help}.
 @item C-h C @var{coding} @key{RET}
 Describe the coding system @var{coding}
 (@code{describe-coding-system}).  @xref{Coding Systems}.
@@ -233,31 +236,31 @@ the button.
 @node Name Help
 @section Help by Command or Variable Name
 
-@kindex C-h f
-@findex describe-function
-  @kbd{C-h f @var{function} @key{RET}} (@code{describe-function})
-displays the documentation of Lisp function @var{function}, in a
-window.  Since commands are Lisp functions, you can use this method to
-view the documentation of any command whose name you know.  For
-example,
+@kindex C-h x
+@findex describe-command
+  @kbd{C-h x @var{command} @key{RET}} (@code{describe-command})
+displays the documentation of the named @var{command}, in a
+window.  For example,
 
 @example
-C-h f auto-fill-mode @key{RET}
+C-h x auto-fill-mode @key{RET}
 @end example
 
 @noindent
-displays the documentation of @code{auto-fill-mode}.  This is the only
-way to get the documentation of a command that is not bound to any key
+displays the documentation of @code{auto-fill-mode}.  This is how you
+would get the documentation of a command that is not bound to any key
 (one which you would normally run using @kbd{M-x}).
 
-  @kbd{C-h f} is also useful for Lisp functions that you use in a Lisp
-program.  For example, if you have just written the expression
+@kindex C-h f
+@findex describe-function
+  @kbd{C-h f @var{function} @key{RET}} (@code{describe-function})
+displays the documentation of Lisp @var{function}.  This command is
+intended for Lisp functions that you use in a Lisp program.  For
+example, if you have just written the expression
 @code{(make-vector len)} and want to check that you are using
-@code{make-vector} properly, type @kbd{C-h f make-vector @key{RET}}.
-Because @kbd{C-h f} allows all function names, not just command names,
-you may find that some of your favorite completion abbreviations that
-work in @kbd{M-x} don't work in @kbd{C-h f}.  An abbreviation that is
-unique among command names may not be unique among all function names.
+@code{make-vector} properly, type @w{@kbd{C-h f make-vector @key{RET}}}.
+Additionally, since all commands are Lisp functions, you can also use
+this command to view the documentation of any command.
 
   If you type @kbd{C-h f @key{RET}}, it describes the function called
 by the innermost Lisp expression in the buffer around point,
@@ -265,7 +268,7 @@ by the innermost Lisp expression in the buffer around point,
 (That name appears as the default while you enter the argument.)  For
 example, if point is located following the text @samp{(make-vector
 (car x)}, the innermost list containing point is the one that starts
-with @samp{(make-vector}, so @kbd{C-h f @key{RET}} describes the
+with @samp{(make-vector}, so @w{@kbd{C-h f @key{RET}}} describes the
 function @code{make-vector}.
 
   @kbd{C-h f} is also useful just to verify that you spelled a
@@ -448,6 +451,13 @@ Go forward to the next help topic (@code{help-go-forward}).
 @item C-c C-b
 @itemx l
 Go back to the previous help topic (@code{help-go-back}).
+@item s
+View the source of the current help topic (if any)
+(@code{help-view-source}).
+@item i
+Look up the current topic in the manual(s) (@code{help-goto-info}).
+@item c
+Customize the variable or the face (@code{help-customize}).
 @end table
 
 @cindex hyperlink
@@ -619,13 +629,14 @@ Emacs Lisp Reference Manual}).
 
 @findex describe-prefix-bindings
   You can get a list of subcommands for a particular prefix key by
-typing @kbd{C-h}, @kbd{?}, or @key{F1}
+typing @kbd{C-h}, @kbd{?}, or @key{f1}
 (@code{describe-prefix-bindings}) after the prefix key.  (There are a
 few prefix keys for which not all of these keys work---those that
 provide their own bindings for that key.  One of these prefix keys
-is @key{ESC}, because @kbd{@key{ESC} C-h} is actually @kbd{C-M-h},
-which marks a defun.  However, @w{@kbd{@key{ESC} @key{F1}}} and
-@w{@kbd{@key{ESC} ?}} work fine.)
+is @key{ESC}, because @kbd{@key{ESC} C-h} and @kbd{@key{ESC} ?} are
+actually @kbd{C-M-h} (@code{mark-defun}) and @kbd{M-?}
+(@code{xref-find-references}), respectively.  However,
+@w{@kbd{@key{ESC} @key{f1}}} works fine.)
 
 @findex describe-keymap
 Finally, @kbd{M-x describe-keymap} prompts for the name of a keymap,
diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi
index 8434040..6e4fd77 100644
--- a/doc/emacs/killing.texi
+++ b/doc/emacs/killing.texi
@@ -269,6 +269,21 @@ happens.  But if you set the variable 
@code{kill-read-only-ok} to a
 non-@code{nil} value, they just print a message in the echo area to
 explain why the text has not been erased.
 
+@vindex kill-transform-function
+  Before saving the kill to the kill ring, you can transform the
+string using @code{kill-transform-function}.  It's called with the
+string to be killed, and it should return the string you want to be
+saved.  It can also return @code{nil}, in which case the string won't
+be saved to the kill ring.  For instance, if you never want to save
+a pure white space string to the kill ring, you can say:
+
+@lisp
+(setq kill-transform-function
+      (lambda (string)
+        (and (not (string-blank-p string))
+             string)))
+@end lisp
+
 @vindex kill-do-not-save-duplicates
   If you change the variable @code{kill-do-not-save-duplicates} to a
 non-@code{nil} value, identical subsequent kills yield a single
@@ -289,8 +304,9 @@ way to move or copy text is to kill it and then yank it 
elsewhere.
 @item C-y
 Yank the last kill into the buffer, at point (@code{yank}).
 @item M-y
-Replace the text just yanked with an earlier batch of killed text
-(@code{yank-pop}).  @xref{Earlier Kills}.
+Either replace the text just yanked with an earlier batch of killed
+text (@code{yank-pop}), or allow to select from the list of
+previously-killed batches of text.  @xref{Earlier Kills}.
 @item C-M-w
 Cause the following command, if it is a kill command, to append to the
 previous kill (@code{append-next-kill}).  @xref{Appending Kills}.
@@ -310,13 +326,13 @@ the end.  Using any other prefix argument specifies an 
earlier kill;
 e.g., @kbd{C-u 4 C-y} reinserts the fourth most recent kill.
 @xref{Earlier Kills}.
 
-  On graphical displays, @kbd{C-y} first checks if another application
-has placed any text in the system clipboard more recently than the
-last Emacs kill.  If so, it inserts the clipboard's text instead.
-Thus, Emacs effectively treats ``cut'' or ``copy'' clipboard
-operations performed in other applications like Emacs kills, except
-that they are not recorded in the kill ring.  @xref{Cut and Paste},
-for details.
+  On graphical displays and on capable text-mode displays, @kbd{C-y}
+first checks if another application has placed any text in the system
+clipboard more recently than the last Emacs kill.  If so, it inserts
+the clipboard's text instead.  Thus, Emacs effectively treats ``cut''
+or ``copy'' clipboard operations performed in other applications like
+Emacs kills, except that they are not recorded in the kill ring.
+@xref{Cut and Paste}, for details.
 
 @menu
 * Kill Ring::           Where killed text is stored.
@@ -354,7 +370,7 @@ with @kbd{C-h v kill-ring}.
 @kbd{C-y} to yank text that is no longer the most recent kill.  This
 is useful if you remember which kill ring entry you want.  If you
 don't, you can use the @kbd{M-y} (@code{yank-pop}) command to cycle
-through the possibilities.
+through the possibilities or to select one of the earlier kills.
 
 @kindex M-y
 @findex yank-pop
@@ -363,45 +379,64 @@ that was yanked and replaces it with the text from an 
earlier kill.
 So, to recover the text of the next-to-the-last kill, first use
 @kbd{C-y} to yank the last kill, and then use @kbd{M-y} to replace it
 with the previous kill.  This works only after a @kbd{C-y}
-or another @kbd{M-y}.
-
-  You can understand @kbd{M-y} in terms of a last-yank pointer which
-points at an entry in the kill ring.  Each time you kill, the last-yank
-pointer moves to the newly made entry at the front of the ring.
-@kbd{C-y} yanks the entry which the last-yank pointer points to.
-@kbd{M-y} moves the last-yank pointer to a different entry, and the
-text in the buffer changes to match.  Enough @kbd{M-y} commands can move
-the pointer to any entry in the ring, so you can get any entry into the
-buffer.  Eventually the pointer reaches the end of the ring; the next
-@kbd{M-y} loops back around to the first entry again.
+or another @kbd{M-y}.  (If @kbd{M-y} is invoked after some other
+command, it works differently, see below.)
+
+  You can understand this operation mode of @kbd{M-y} in terms of a
+last-yank pointer which points at an entry in the kill ring.  Each
+time you kill, the last-yank pointer moves to the newly made entry at
+the front of the ring.  @kbd{C-y} yanks the entry which the last-yank
+pointer points to.  @kbd{M-y} after a @kbd{C-y} or another @kbd{M-y}
+moves the last-yank pointer to the previous entry, and the text in the
+buffer changes to match.  Enough @kbd{M-y} commands one after another
+can move the pointer to any entry in the ring, so you can get any
+entry into the buffer.  Eventually the pointer reaches the end of the
+ring; the next @kbd{M-y} loops back around to the first entry again.
 
   @kbd{M-y} moves the last-yank pointer around the ring, but it does
 not change the order of the entries in the ring, which always runs from
 the most recent kill at the front to the oldest one still remembered.
 
-  @kbd{M-y} can take a numeric argument, which tells it how many entries
-to advance the last-yank pointer by.  A negative argument moves the
-pointer toward the front of the ring; from the front of the ring, it
-moves around to the last entry and continues forward from there.
+  When used after @kbd{C-y} or @kbd{M-y}, @kbd{M-y} can take a numeric
+argument, which tells it how many entries to advance the last-yank
+pointer by.  A negative argument moves the pointer toward the front of
+the ring; from the front of the ring, it moves around to the last
+entry and continues forward from there.
 
-  Once the text you are looking for is brought into the buffer, you can
-stop doing @kbd{M-y} commands and it will stay there.  It's just a copy
-of the kill ring entry, so editing it in the buffer does not change
-what's in the ring.  As long as no new killing is done, the last-yank
-pointer remains at the same place in the kill ring, so repeating
-@kbd{C-y} will yank another copy of the same previous kill.
+  Once the text you are looking for is brought into the buffer, you
+can stop doing @kbd{M-y} commands and the last yanked text will stay
+there.  It's just a copy of the kill ring entry, so editing it in the
+buffer does not change what's in the ring.  As long as no new killing
+is done, the last-yank pointer remains at the same place in the kill
+ring, so repeating @kbd{C-y} will yank another copy of the same
+previous kill.
 
   When you call @kbd{C-y} with a numeric argument, that also sets the
 last-yank pointer to the entry that it yanks.
 
-  Alternatively, when the previous command was not a yank command,
-@kbd{M-y} activates the minibuffer where you can browse previous kills
-using the minibuffer history commands (@pxref{Minibuffer History}), or
-you can use completion commands (@pxref{Completion}) on a list of
-previously killed blocks of text from the kill ring.  Exiting the
-minibuffer will insert the selected text to the buffer.  With a plain
-prefix argument (@kbd{C-u M-y}), this command leaves the cursor in
-front of the inserted text, and sets the mark at the end.
+  You can also invoke @kbd{M-y} after a command that is not a yank
+command.  In that case, @kbd{M-y} prompts you in the minibuffer for
+one of the previous kills.  You can use the minibuffer history
+commands (@pxref{Minibuffer History}) to navigate or search through
+the entries in the kill ring until you find the one you want to
+reinsert.  Or you can use completion commands (@pxref{Completion
+Commands}) to complete on an entry from the list of entries in the
+kill ring or pop up the @file{*Completions*} buffer with the candidate
+entries from which you can choose.  After selecting the kill-ring
+entry, you can optionally edit it in the minibuffer.  Finally, type
+@kbd{RET} to exit the minibuffer and insert the text of the selected
+kill-ring entry.  Like in case of @kbd{M-y} after another yank
+command, the last-yank pointer is left pointing at the text you just
+yanked, whether it is one of the previous kills or an entry from the
+kill-ring that you edited before inserting it.  (In the latter case,
+the edited entry is added to the front of the kill-ring.)  So here,
+too, typing @kbd{C-y} will yank another copy of the text just
+inserted.
+
+  When invoked with a plain prefix argument (@kbd{C-u M-y}) after a
+command that is not a yank command, @kbd{M-y} leaves the cursor in
+front of the inserted text, and sets the mark at the end, like
+@kbd{C-y} does.
 
 @node Appending Kills
 @subsection Appending Kills
@@ -502,11 +537,14 @@ clipboard.
 
 @vindex save-interprogram-paste-before-kill
   When an Emacs kill command puts text in the clipboard, the existing
-clipboard contents are normally lost.  Optionally, you can change
-@code{save-interprogram-paste-before-kill} to @code{t}.  Then Emacs
-will first save the clipboard to its kill ring, preventing you from
-losing the old clipboard data---at the risk of high memory consumption
-if that data turns out to be large.
+clipboard contents are normally lost.  Optionally, Emacs can save the
+existing clipboard contents to the kill ring, preventing you from
+losing the old clipboard data.  If
+@code{save-interprogram-paste-before-kill} changed to a number, then
+this data is copied over if it's smaller (in characters) than this
+number.  If this variable is any other non-@code{nil} value, it's
+always copied over---at the risk of high memory consumption if that
+data turns out to be large.
 
   Yank commands, such as @kbd{C-y} (@code{yank}), also use the
 clipboard.  If another application ``owns'' the clipboard---i.e., if
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index 880829a..a91bfac 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -32,6 +32,10 @@ symbols (a.k.a.@: ``identifiers'') and their references.
 A mode for merging changes to program sources made on separate
 branches of development.
 @end ifnottex
+
+@item
+A minor-mode for highlighting bug references and visiting the
+referenced bug reports in their issue tracker.
 @end itemize
 
 If you are maintaining a large Lisp program, then in addition to the
@@ -49,6 +53,8 @@ Lisp Regression Testing}).
 @ifnottex
 * Emerge::              A convenient way of merging two versions of a program.
 @end ifnottex
+* Bug Reference::       Highlighting references to bug reports and browsing
+                          them in their issue trackers.
 @end menu
 
 @node Version Control
@@ -2657,6 +2663,10 @@ generate a tag.
 @item
 In Ruby code, @code{def} or @code{class} or @code{module} at the
 beginning of a line generate a tag.  Constants also generate tags.
+
+@item
+In Rust code, tags anything defined with @code{fn}, @code{enum},
+@code{struct} or @code{macro_rules!}.
 @end itemize
 
   You can also generate tags based on regexp matching (@pxref{Etags
@@ -3049,3 +3059,170 @@ the target should be built.
 @ifnottex
 @include emerge-xtra.texi
 @end ifnottex
+
+
+@node Bug Reference
+@section Bug Reference
+@cindex bug reference
+
+Most projects with a certain amount of users track bug reports in some
+issue tracking software which assigns each report a unique and short
+number or identifier.  Those are used to reference a given bug, e.g.,
+in a source code comment above the code fixing some bug, in
+documentation files, or in discussions on some mailinglist or IRC
+channel.
+
+@findex bug-reference-mode
+@findex bug-reference-prog-mode
+  The minor modes @code{bug-reference-mode} and
+@code{bug-reference-prog-mode} highlight such bug references and make
+it possible to follow them to the corresponding bug report on the
+project's issue tracker.  @code{bug-reference-prog-mode} is a variant
+of @code{bug-reference-mode} which highlights bug references only
+inside source code comments and strings.
+
+@vindex bug-reference-bug-regexp
+@vindex bug-reference-url-format
+  For its working, bug reference mode needs to know the syntax of bug
+references (@code{bug-reference-bug-regexp}), and the URL of the
+tracker where bug reports can be looked up
+(@code{bug-reference-url-format}).  Since those are typically
+different from project to project, it makes sense to specify them in
+@pxref{Directory Variables} or @pxref{File Variables}.
+
+For example, let's assume in our project, we usually write references
+to bug reports as bug#1234, or Bug-1234 and that this bug's page on
+the issue tracker is @url{https://project.org/issues/1234}, then
+these local variables section would do.
+
+@smallexample
+;; Local Variables:
+;; bug-reference-bug-regexp: "\\([Bb]ug[#-]\\)\\([0-9]+\\)"
+;; bug-reference-url-format: "https://project.org/issues/%s";
+;; End:
+@end smallexample
+
+The string captured by the second regexp group in
+@code{bug-reference-bug-regexp} is used to replace the @code{%s}
+template in the @code{bug-reference-url-format}.
+
+Note that @code{bug-reference-url-format} may also be a function in
+order to cater for more complex scenarios, e.g., when the part before
+the actual bug number has to be used to distinguish between issues and
+merge requests where each of them has a different URL.
+
+
+@heading Automatic Setup
+
+@vindex bug-reference-auto-setup-functions
+If @code{bug-reference-mode} is activated,
+@code{bug-reference-mode-hook} has been run and still
+@code{bug-reference-bug-regexp}, and @code{bug-reference-url-format}
+aren't both set, it'll try to setup suitable values for these two
+variables itself by calling the functions in
+@code{bug-reference-auto-setup-functions} one after the other until
+one is able to set the variables.
+
+@vindex bug-reference-setup-from-vc-alist
+@vindex bug-reference-setup-from-mail-alist
+@vindex bug-reference-setup-from-irc-alist
+  Right now, there are three types of setup functions.
+@enumerate
+@item
+Setup for version-controlled files configurable by the variable
+@code{bug-reference-setup-from-vc-alist}.  The default is able to
+setup GNU projects where @url{https://debbugs.gnu.org} is used as
+issue tracker, Github projects where both bugs and pull requests are
+referenced using the @code{#42} notation, and GitLab projects where
+bugs are references with @code{#17}, too, but merge requests use the
+@code{!18} notation.
+
+@item
+Setup for email guessing from mail folder/mbox names, and mail header
+values configurable by the variable
+@code{bug-reference-setup-from-mail-alist}.  The built-in news- and
+mailreader @ref{Gnus} and @ref{Rmail} are supported.
+
+@item
+Setup for IRC channels configurable by the variable
+@code{bug-reference-setup-from-irc-alist}.  The built-in IRC clients
+Rcirc, @xref{Top, Rcirc,, rcirc, The Rcirc Manual}, and ERC,
+@xref{Top, ERC,, erc, The ERC Manual}, are supported.
+@end enumerate
+
+For almost all of those modes, it's enough to simply enable
+@code{bug-reference-mode}, only Rmail requires a slightly different
+setup.
+
+@smallexample
+;; Use VC-based setup if file is under version control.
+(add-hook 'prog-mode-hook #'bug-reference-prog-mode)
+
+;; Gnus (summary & article buffers)
+(add-hook 'gnus-mode-hook #'bug-reference-mode)
+
+;; Rmail
+(add-hook 'rmail-show-message-hook #'bug-reference-mode-force-auto-setup)
+
+;; Rcirc
+(add-hook 'rcirc-mode-hook #'bug-reference-mode)
+
+;; ERC
+(add-hook 'erc-mode-hook #'bug-reference-mode)
+@end smallexample
+
+In the Rmail case, instead of the mode hook, the
+@code{rmail-show-message-hook} has to be used in combination with the
+function @code{bug-reference-mode-force-auto-setup} which activates
+@code{bug-reference-mode} and forces auto-setup.  The reason is that
+with Rmail all messages reside in the same buffer but the setup needs
+to be performed whenever another messages is displayed.
+
+
+@heading Adding support for third-party packages
+
+@vindex bug-reference-auto-setup-functions
+Adding support for bug-reference' auto-setup is usually quite
+straight-forward: write a setup function of zero arguments which
+gathers the required information (e.g., List-Id/To/From/Cc mail header
+values in the case of a MUA), and then calls one of the following
+helper functions:
+@itemize @bullet
+@item
+@code{bug-reference-maybe-setup-from-vc} which does the setup
+according to @code{bug-reference-setup-from-vc-alist},
+
+@item
+@code{bug-reference-maybe-setup-from-mail} which does the setup
+according to @code{bug-reference-setup-from-mail-alist},
+
+@item
+and @code{bug-reference-maybe-setup-from-irc} which does the setup
+according to @code{bug-reference-setup-from-irc-alist}.
+@end itemize
+A setup function should return non-nil if it could setup bug-reference
+mode which is the case if the last thing the function does is calling
+one of the helper functions above.
+
+Finally, the setup function has to be added to
+@code{bug-reference-auto-setup-functions}.
+
+Note that these auto-setup functions should check as a first step if
+they are applicable, e.g., by checking the @code{major-mode} value.
+
+
+@heading Integration with the debbugs package
+
+@findex debbugs-browse-mode
+If your project's issues are tracked on the server
+@url{https://debbugs.gnu.org}, you can browse and reply to reports
+directly in Emacs using the @code{debbugs} package, which can be
+downloaded via the Package Menu (@pxref{Packages}).  This package adds
+the minor mode @code{debbugs-browse-mode}, which can be activated on
+top of @code{bug-reference-mode} and @code{bug-reference-prog-mode} as
+follows:
+
+@smallexample
+(add-hook 'bug-reference-mode-hook 'debbugs-browse-mode)
+(add-hook 'bug-reference-prog-mode-hook 'debbugs-browse-mode)
+@end smallexample
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index 03db669..6dcee3f 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -374,9 +374,9 @@ used with the completion list:
 @itemx @key{prior}
 Typing @kbd{M-v}, while in the minibuffer, selects the window showing
 the completion list (@code{switch-to-completions}).  This paves the
-way for using the commands below.  @key{PageUp} or @key{prior} does
-the same.  You can also select the window in other ways
-(@pxref{Windows}).
+way for using the commands below.  @key{PageUp}, @key{prior} and
+@kbd{M-g M-c} does the same.  You can also select the window in other
+ways (@pxref{Windows}).
 
 @findex choose-completion
 @item @key{RET}
@@ -388,12 +388,14 @@ point (@code{choose-completion}).
 @findex next-completion
 @item @key{TAB}
 @item @key{RIGHT}
+@item @key{n}
 While in the completion list buffer, these keys move point to the
 following completion alternative (@code{next-completion}).
 
 @findex previous-completion
 @item @key{S-TAB}
 @item @key{LEFT}
+@item @key{p}
 While in the completion list buffer, these keys move point to the
 previous completion alternative (@code{previous-completion}).
 
@@ -628,6 +630,14 @@ in a cyclic manner.  If you give 
@code{completion-cycle-threshold} a
 numeric value @var{n}, completion commands switch to this cycling
 behavior only when there are @var{n} or fewer alternatives.
 
+@vindex completions-format
+  When displaying completions, Emacs will normally pop up a new buffer
+to display the completions.  The completions will (by default) be
+sorted in columns horizontally in alphabetical order, but this can be
+changed by changing the @code{completions-format} user option.  If
+@code{vertical}, sort the completions vertically in columns instead,
+and if @code{one-column}, just use a single column.
+
 @node Minibuffer History
 @section Minibuffer History
 @cindex minibuffer history
diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index fbb8122..3c11a39 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1757,6 +1757,13 @@ expression @code{(+ 1 2)} on the @samp{foo} server, and 
returns
 @code{3}.  (If there is no server with that name, an error is
 signaled.)  Currently, this feature is mainly useful for developers.
 
+  If your operating system’s desktop environment is
+@url{https://www.freedesktop.org/wiki/Specifications/,,freedesktop.org-compatible}
+(which is true of most GNU/Linux and other recent Unix-like GUIs), you
+may use the @samp{Emacs (Client)} menu entry to connect to an Emacs
+server with @command{emacsclient}.  The daemon starts if not
+already running.
+
 @menu
 * TCP Emacs server::     Listening to a TCP socket.
 * Invoking emacsclient:: Connecting to the Emacs server.
@@ -1864,6 +1871,12 @@ it to exit.  Programs that use @env{EDITOR} usually wait 
for the
 editor---in this case @command{emacsclient}---to exit before doing
 something else.
 
+@findex server-edit-abort
+  If you want to abandon the edit instead, use the @w{@kbd{M-x
+server-edit-abort}} command.  This sends a message back to the
+@command{emacsclient} program, telling it to exit with abnormal exit
+status, and doesn't save any buffers.
+
   You can also call @command{emacsclient} with multiple file name
 arguments: @samp{emacsclient @var{file1} @var{file2} ...} tells the
 Emacs server to visit @var{file1}, @var{file2}, and so forth.  Emacs
@@ -2576,6 +2589,17 @@ Other Hexl commands let you insert strings (sequences) 
of binary
 bytes, move by @code{short}s or @code{int}s, etc.; type @kbd{C-h a
 hexl-@key{RET}} for details.
 
+  Hexl mode can also be used for editing text files.  This could come
+in handy if the text file includes unusual characters or uses unusual
+encoding (@pxref{Coding Systems}).  For this purpose, Hexl commands
+that insert bytes can also insert @acronym{ASCII} and
+non-@acronym{ASCII} characters, including multibyte characters.  To
+edit a text file with Hexl, visit the file as usual, and then type
+@w{@kbd{M-x hexl-mode @key{RET}}} to switch to Hexl mode.  You can now
+insert text characters by typing them.  However, inserting multibyte
+characters requires special care, to avoid the danger of creating
+invalid multibyte sequences: you should start typing such characters
+when point is on the first byte of a multibyte sequence in the file.
 
 @node Saving Emacs Sessions
 @section Saving Emacs Sessions
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index c2bd5cb..d419a4e 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -416,12 +416,12 @@ just make some new commands available, while others have 
more
 wide-ranging effects on the Emacs session.  For such information,
 consult the package's help buffer.
 
-  After a package is installed, it is automatically made available by
-Emacs in all subsequent sessions.  This happens at startup, before
-processing the init file but after processing the early init file
-(@pxref{Early Init File}).  As an exception, Emacs does not make
-packages available at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+  Installed packages are automatically made available by Emacs in all
+subsequent sessions.  This happens at startup, before processing the
+init file but after processing the early init file (@pxref{Early Init
+File}).  As an exception, Emacs does not make packages available at
+startup if invoked with the @samp{-q} or @samp{--no-init-file} options
+(@pxref{Initial Options}).
 
 @vindex package-enable-at-startup
   To keep Emacs from automatically making packages available at
@@ -430,6 +430,17 @@ startup, change the variable 
@code{package-enable-at-startup} to
 is read before loading the regular init file.  Currently this variable
 cannot be set via Customize.
 
+@findex package-quickstart-refresh
+@vindex package-quickstart
+  If you have many packages installed, you can improve startup times
+by setting the user option @code{package-quickstart} to @code{t}.
+Setting this option will make Emacs precompute many things instead of
+re-computing them on every Emacs startup.  However, if you do this,
+then you have to manually run the command
+@code{package-quickstart-refresh} when the activations need to be
+changed, such as when you change the value of
+@code{package-load-list}.
+
 @findex package-activate-all
   If you have set @code{package-enable-at-startup} to @code{nil}, you
 can still make packages available either during or after startup.  To
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index 38430a2..e6b066e 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -301,13 +301,11 @@ from point to the @var{n}th occurrence of the specified 
character.
 @findex isearch-yank-x-selection
   Within incremental search, @kbd{C-y} (@code{isearch-yank-kill})
 appends the current kill to the search string.  @kbd{M-y}
-(@code{isearch-yank-pop}), if called after @kbd{C-y}, replaces that
-appended text with an earlier kill, similar to the usual @kbd{M-y}
-(@code{yank-pop}) command.  When @kbd{M-y} is called not after
-@kbd{C-y}, then it activates the minibuffer where you can select
-a previous kill to append to the search string (@pxref{Earlier
-Kills}).  Clicking @kbd{mouse-2} in the echo area appends the current
-X selection (@pxref{Primary Selection}) to the search string
+(@code{isearch-yank-pop}), if called after @kbd{C-y} during
+incremental search, replaces that appended text with an earlier kill,
+similar to the usual @kbd{M-y} (@code{yank-pop}) command.  Clicking
+@kbd{mouse-2} in the echo area appends the current X selection
+(@pxref{Primary Selection}) to the search string
 (@code{isearch-yank-x-selection}).
 
 @kindex C-M-d @r{(Incremental search)}
diff --git a/doc/emacs/text.texi b/doc/emacs/text.texi
index 2c9d486..f2fe248 100644
--- a/doc/emacs/text.texi
+++ b/doc/emacs/text.texi
@@ -421,13 +421,12 @@ beginning of a line.
 @cindex curved quotes
 @cindex guillemets
 @findex electric-quote-mode
-@c The funny quoting below is to make the printed version look
-@c correct.  FIXME.
+
   One common way to quote is the typewriter convention, which quotes
-using straight apostrophes @t{'like this'} or double-quotes @t{"like
+using straight apostrophes @samp{'like this'} or double-quotes @samp{"like
 this"}.  Another common way is the curved quote convention, which uses
-left and right single or double quotation marks `@t{like this}' or
-``@t{like this}''@footnote{
+left and right single or double quotation marks @t{‘like this’} or
+@t{“like this”}@footnote{
 The curved single quote characters are U+2018 @sc{left single quotation
 mark} and U+2019 @sc{right single quotation mark}; the curved double quotes
 are U+201C @sc{left double quotation mark} and U+201D @sc{right double
@@ -445,7 +444,7 @@ default quotes listed above, by customizing the variable
 @code{electric-quote-chars}, a list of four characters, where the
 items correspond to the left single quote, the right single quote, the
 left double quote and the right double quote, respectively, whose
-default value is @code{'(?@r{`} ?@r{'} ?@r{``} ?@r{''})}.
+default value is @w{@code{'(@w{?}‘ ?’ ?“ ?”)}}.
 
 @vindex electric-quote-paragraph
 @vindex electric-quote-comment
@@ -461,7 +460,7 @@ variables.
 
 @vindex electric-quote-replace-double
   You can also set the option @code{electric-quote-replace-double} to
-a non-@code{nil} value.  Then, typing @t{"} insert an appropriate
+a non-@code{nil} value.  Then, typing @kbd{"} insert an appropriate
 curved double quote depending on context: @t{“} at the beginning of
 the buffer or after a line break, whitespace, opening parenthesis, or
 quote character, and @t{”} otherwise.
@@ -473,7 +472,7 @@ To toggle it globally, type
 type @kbd{C-q `} or @kbd{C-q '} instead of @kbd{`} or @kbd{'}.  To
 insert a curved quote even when Electric Quote is disabled or
 inactive, you can type @kbd{C-x 8 [} for @t{‘}, @kbd{C-x 8 ]} for
-@t{’}, @kbd{C-x 8 @{} for ``, and @kbd{C-x 8 @}} for ''.
+@t{’}, @kbd{C-x 8 @{} for @t{“}, and @kbd{C-x 8 @}} for @t{”}.
 @xref{Inserting Text}.  Note that the value of
 @code{electric-quote-chars} does not affect these keybindings, they
 are not keybindings of @code{electric-quote-mode} but bound in
diff --git a/doc/emacs/windows.texi b/doc/emacs/windows.texi
index c66deb7..facbc7f 100644
--- a/doc/emacs/windows.texi
+++ b/doc/emacs/windows.texi
@@ -310,6 +310,9 @@ the space that it occupied is given to an adjacent window 
(but not the
 minibuffer window, even if that is active at the time).  Deleting the
 window has no effect on the buffer it used to display; the buffer
 continues to exist, and you can still switch to it with @kbd{C-x b}.
+The option @code{delete-window-choose-selected} allows to choose which
+window becomes the new selected window instead (@pxref{Deleting
+Windows,,, elisp, The Emacs Lisp Reference Manual}).
 
 @findex kill-buffer-and-window
 @kindex C-x 4 0
diff --git a/doc/lispref/backups.texi b/doc/lispref/backups.texi
index c0a4065..85a4f9e 100644
--- a/doc/lispref/backups.texi
+++ b/doc/lispref/backups.texi
@@ -481,6 +481,12 @@ all directory separators were changed to @samp{!} to 
prevent clashes.
 (This will not work correctly if your filesystem truncates the
 resulting name.)
 
+If @var{uniquify} is one of the members of
+@code{secure-hash-algorithms}, Emacs constructs the nondirectory part
+of the auto-save file name by applying that @code{secure-hash} to the
+buffer file name.  This avoids any risk of excessively long file
+names.
+
 All the transforms in the list are tried, in the order they are listed.
 When one transform applies, its result is final;
 no further transforms are tried.
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 8199ece..f30419c 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -454,10 +454,13 @@ This kind of input is used by commands such as 
@code{describe-key} and
 @code{global-set-key}.
 
 @item K
-A key sequence, whose definition you intend to change.  This works like
-@samp{k}, except that it suppresses, for the last input event in the key
-sequence, the conversions that are normally used (when necessary) to
-convert an undefined key into a defined one.
+A key sequence on a form that can be used as input to functions like
+@code{define-key}.  This works like @samp{k}, except that it
+suppresses, for the last input event in the key sequence, the
+conversions that are normally used (when necessary) to convert an
+undefined key into a defined one (@pxref{Key Sequence Input}), so this
+form is usually used when prompting for a new key sequence that is to
+be bound to a command.
 
 @item m
 @cindex marker argument
diff --git a/doc/lispref/compile.texi b/doc/lispref/compile.texi
index 6624234..f48f4f4 100644
--- a/doc/lispref/compile.texi
+++ b/doc/lispref/compile.texi
@@ -361,7 +361,7 @@ it does nothing.  It always returns @var{function}.
   These features permit you to write code to be evaluated during
 compilation of a program.
 
-@defspec eval-and-compile body@dots{}
+@defmac eval-and-compile body@dots{}
 This form marks @var{body} to be evaluated both when you compile the
 containing code and when you run it (whether compiled or not).
 
@@ -386,9 +386,9 @@ If functions are defined programmatically (with @code{fset} 
say), then
 @code{eval-and-compile} can be used to have that done at compile-time
 as well as run-time, so calls to those functions are checked (and
 warnings about ``not known to be defined'' suppressed).
-@end defspec
+@end defmac
 
-@defspec eval-when-compile body@dots{}
+@defmac eval-when-compile body@dots{}
 This form marks @var{body} to be evaluated at compile time but not when
 the compiled program is loaded.  The result of evaluation by the
 compiler becomes a constant which appears in the compiled program.  If
@@ -434,7 +434,7 @@ with other versions of Emacs.
 Lisp idiom @code{(eval-when (compile eval) @dots{})}.  Elsewhere, the
 Common Lisp @samp{#.} reader macro (but not when interpreting) is closer
 to what @code{eval-when-compile} does.
-@end defspec
+@end defmac
 
 @node Compiler Errors
 @section Compiler Errors
@@ -793,3 +793,251 @@ The @code{silly-loop} function is somewhat more complex:
 17  return                ; @r{Return value of the top of stack.}
 @end group
 @end example
+
+@node Native Compilation
+@chapter Compilation of Lisp to Native Code
+@cindex native compilation
+@cindex compilation to native code (Emacs Lisp)
+
+@cindex native code
+  In addition to the byte-compilation, described in @ref{Byte
+Compilation, the previous chapter}, Emacs can also optionally compile
+Lisp function definitions into a true compiled code, known as
+@dfn{native code}.  This feature uses the @file{libgccjit} library,
+which is part of the GCC distribution, and requires that Emacs be
+built with support for using that library.  It also requires to have
+GCC and Binutils (the assembler and linker) available on your system
+for you to be able to native-compile Lisp code.
+
+@vindex native-compile@r{, a Lisp feature}
+  To determine whether the current Emacs process can produce and load
+natively-compiled Lisp code, test whether the @code{native-compile}
+feature is available (@pxref{Named Features}).  Alternatively, call
+@code{native-comp-available-p} (@pxref{Native-Compilation Functions}).
+
+  Unlike byte-compiled code, natively-compiled Lisp code is executed
+directly by the machine's hardware, and therefore runs at full speed
+that the host CPU can provide.  The resulting speedup generally
+depends on what the Lisp code does, but is usually 2.5 to 5 times
+faster than the corresponding byte-compiled code.
+
+  Since native code is generally incompatible between different
+systems, the natively-compiled code is @emph{not} transportable from
+one machine to another, it can only be used on the same machine where
+it was produced or on very similar ones (having the same CPU and
+run-time libraries).  The transportability of natively-compiled code
+is the same as that of shared libraries (@file{.so} or @file{.dll}
+files).
+
+  Libraries of natively-compiled code include crucial dependencies on
+Emacs Lisp primitives (@pxref{What Is a Function}) and their calling
+conventions, and thus Emacs usually won't load natively-compiled code
+produced by earlier or later Emacs versions; native compilation of the
+same Lisp code by a different Emacs version will usually produce a
+natively-compiled library under a unique file name that only that
+version of Emacs will be able to load.  However, the use of unique
+file names allows to have in the same directory several versions of
+the same Lisp library natively-compiled by several different versions
+of Emacs.
+
+@vindex no-native-compile
+  A non-@code{nil} file-local variable binding of
+@code{no-byte-compile} (@pxref{Byte Compilation}) also disables the
+native compilation of that file.  In addition, a similar variable
+@code{no-native-compile} disables just the native compilation of the
+file.  If both @code{no-byte-compile} and @code{no-native-compile} are
+specified, the former takes precedence.
+
+@menu
+* Native-Compilation Functions::  Functions to natively-compile Lisp.
+* Native-Compilation Variables::  Variables controlling native compilation.
+@end menu
+
+@node Native-Compilation Functions
+@section Native-Compilation Functions
+@cindex native-compilation functions
+
+   Native-Compilation is implemented as a side effect of
+byte-compilation (@pxref{Byte Compilation}).  Thus, compiling Lisp
+code natively always produces its byte code as well, and therefore all
+the rules and caveats of preparing Lisp code for byte compilation
+(@pxref{Compilation Functions}) are valid for native-compilation as
+well.
+
+   You can natively-compile either a single function or macro
+definition, or a whole file of Lisp code, with the
+@code{native-compile} function.  Natively-compiling a file will
+produce both the corresponding @file{.elc} file with byte code and the
+@file{.eln} file with native code.
+
+@findex native-comp-limple-mode
+@vindex native-comp-verbose
+  Native compilation might produce warning or error messages; these
+are normally recorded in the buffer called
+@file{*Native-compile-Log*}.  In interactive sessions, it uses the
+special LIMPLE mode (@code{native-comp-limple-mode}), which sets up
+@code{font-lock} as appropriate for this log, and is otherwise the
+same as Fundamental mode.  Logging of messages resulting from
+native-compilation can be controlled by the @code{native-comp-verbose}
+variable (@pxref{Native-Compilation Variables}).
+
+  When Emacs is run non-interactively, messages produced by
+native-compilation are reported by calling @code{message}
+(@pxref{Displaying Messages}), and are usually displayed on the
+standard error stream of the terminal from which Emacs was invoked.
+
+@defun native-compile function-or-file &optional output
+This function compiles @var{function-or-file} into native code.  The
+argument @var{function-or-file} can be a function symbol, a Lisp form,
+or a name (a string) of the file which contains the Emacs Lisp source
+code to compile.  If the optional argument @var{output} is provided,
+it must be a string specifying the name of the file to write the
+compiled code into.  Otherwise, if @var{function-or-file} is a
+function or a Lisp form, this function returns the compiled object,
+and if @var{function-or-file} is a file name, the function returns the
+full absolute name of the file it created for the compiled code.  The
+output file is by default given the @file{.eln} extension.
+
+This function runs the final phase of the native compilation, which
+invokes GCC via @file{libgccjit}, in a separate subprocess, which
+invokes the same Emacs executable as the process that called this
+function.
+@end defun
+
+@defun batch-native-compile
+This function runs native-compilation on files specified on the Emacs
+command line in batch mode.  It must be used only in a batch execution
+of Emacs, as it kills Emacs upon completion of the compilation.  If
+one or more of the files fail to compile, the Emacs process will
+attempt to compile all the other files, and will terminate with a
+non-zero status code.
+@end defun
+
+Native compilation can be run entirely asynchronously, in a subprocess
+of the main Emacs process.  This leaves the main Emacs process free to
+use while the compilation runs in the background.  This is the method
+used by Emacs to natively-compile any Lisp file or byte-compiled Lisp
+file that is loaded into Emacs, when no natively-compiled file for it
+is available.
+
+@defun native-compile-async files &optional recursively load selector
+This function compiles the named @var{files} asynchronously.  The
+argument @var{files} should be a single file name (a string) or a list
+of one or more file and/or directory names.  If directories are
+present in the list, the optional argument @var{recursively} should be
+non-@code{nil} to cause the compilation to recurse into those
+directories.  If @var{load} is non-@code{nil}, Emacs will load each
+file that it succeeded to compile.  The optional argument
+@var{selector} allows control of which of @var{files} will be
+compiled; it can have one of the following values:
+
+@table @asis
+@item @code{nil} or omitted
+Select all the files and directories in @var{files}.
+@item a regular expression string
+Select the files and directories whose names match the regexp.
+@item a function
+A predicate function, which will be called with each file and
+directory in @var{files}, and should return non-@code{nil} if the file
+or the directory should be selected for compilation.
+@end table
+
+On systems with multiple CPU execution units, when @var{files} names
+more than one file, this function will normally start several
+compilation subprocesses in parallel, under the control of
+@code{native-comp-async-jobs-number} (@pxref{Native-Compilation
+Variables}).
+@end defun
+
+  The following function allows Lisp programs to test whether
+native-compilation is available at runtime.
+
+@defun native-comp-available-p
+This function returns non-@code{nil} if the running Emacs process has
+the native-compilation support compiled into it.  On systems that load
+@file{libgccjit} dynamically, it also makes sure that library is
+available and can be loaded.  Lisp programs that need to know up front
+whether native-compilation is available should use this predicate.
+@end defun
+
+@node Native-Compilation Variables
+@section Native-Compilation Variables
+@cindex native-compilation variables
+
+  This section documents the variables that control
+native-compilation.
+
+@defopt native-comp-speed
+This variable specifies the optimization level for native compilation.
+Its value should be a number between @minus{}1 and 3.  Values between
+0 and 3 specify the optimization levels equivalent to the
+corresponding compiler @option{-O0}, @option{-O1}, etc.@: command-line
+options of the compiler.  The value @minus{}1 means disable
+native-compilation; functions and files will be only byte-compiled.
+The default value is 2.
+@end defopt
+
+@defopt native-comp-debug
+This variable specifies the level of debugging information produced by
+native-compilation.  Its value should be a number between zero and 3,
+with the following meaning:
+
+@table @asis
+@item 0
+No debugging output.  This is the default.
+@item 1
+Emit debugging symbols with the native code.  This allows easier
+debugging of the native code with debuggers such as @command{gdb}.
+@item 2
+Like 1, and in addition dump pseudo-C code.
+@item 3
+Like 2, and in addition dump the GCC intermediate passes and
+@file{libgccjit} log file.
+@end table
+@end defopt
+
+@defopt native-comp-verbose
+This variable controls the verbosity of native-compilation by
+suppressing some or all of the log messages emitted by it.  If its
+value is zero, the default, all of the log messages are suppressed.
+Setting it to a value between 1 and 3 will allow logging of the
+messages whose level is above the value.  The values have the
+following interpretations:
+
+@table @asis
+@item 0
+No logging.  This is the default.
+@item 1
+Log the final @acronym{LIMPLE} representation of the code.
+@item 2
+Log the @acronym{LAP}, the final @acronym{LIMPLE}, and some additional
+pass info.
+@item 3
+Maximum verbosity: log everything.
+@end table
+@end defopt
+
+@defopt native-comp-async-jobs-number
+This variable determines the maximum number of native-compilation
+subprocesses that will be started simultaneously.  It should be a
+non-negative number.  The default value is zero, which means use half
+the number of the CPU execution units, or 1 if the CPU has only one
+execution unit.
+@end defopt
+
+@defopt native-comp-async-report-warnings-errors
+If this variable's value is non-@code{nil}, warnings and errors from
+asynchronous native-compilation subprocesses are reported in the main
+Emacs session in a buffer named @file{*Warnings*}.  The default value
+@code{t} means display the resulting buffer.  To log warnings without
+popping up the @file{*Warnings*} buffer, set this variable to
+@code{silent}.
+@end defopt
+
+@defopt native-comp-async-query-on-exit
+If this variable's value is non-nil, Emacs will query upon exiting
+whether to exit and kill any asynchronous native-compilation
+subprocesses that are still running, thus preventing the corresponding
+@file{.eln} files from being written.  If the value is @code{nil}, the
+default, Emacs will kill these subprocesses without querying.
+@end defopt
diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi
index de98d22..e458d76 100644
--- a/doc/lispref/debugging.texi
+++ b/doc/lispref/debugging.texi
@@ -997,11 +997,12 @@ start looking for ways to optimize that piece.
 @findex profiler-report
 @findex profiler-stop
 Emacs has built-in support for this.  To begin profiling, type
-@kbd{M-x profiler-start}.  You can choose to profile by processor
-usage, memory usage, or both.  Then run the code you'd like to speed
-up.  After that, type @kbd{M-x profiler-report} to display a summary
-buffer for each resource (cpu and memory) that you chose to profile.
-The names of the report buffers include the times at which the reports
+@w{@kbd{M-x profiler-start}}.  You can choose to sample CPU usage
+periodically (@code{cpu}), when memory is allocated (@code{memory}),
+or both.  Then run the code you'd like to speed up.  After that, type
+@kbd{M-x profiler-report} to display a summary buffer for CPU usage
+sampled by each type (cpu and memory) that you chose to profile.  The
+names of the report buffers include the times at which the reports
 were generated, so you can generate another report later on without
 erasing previous results.  When you have finished profiling, type
 @kbd{M-x profiler-stop} (there is a small overhead associated with
@@ -1009,7 +1010,7 @@ profiling, so we don't recommend leaving it active except 
when you are
 actually running the code you want to examine).
 
 The profiler report buffer shows, on each line, a function that was
-called, preceded by how much resources (cpu or memory) it used in
+called, preceded by how much CPU resources it used in
 absolute and percentage terms since profiling started.  If a given
 line has a @samp{+} symbol to the left of the function name, you can
 expand that line by typing @kbd{@key{RET}}, in order to see the
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 228c940..3336338 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -3007,9 +3007,10 @@ This function returns non-@code{nil} if face @var{face} 
specifies
 a non-@code{nil} @code{:inverse-video} attribute.
 @end defun
 
-@defun face-extend-p face &optional frame
+@defun face-extend-p face &optional frame inherit
 This function returns non-@code{nil} if face @var{face} specifies
-a non-@code{nil} @code{:extend} attribute.
+a non-@code{nil} @code{:extend} attribute.  The @var{inherit} argument
+is passed to @code{face-attribute}.
 @end defun
 
 
@@ -7615,7 +7616,7 @@ Chars}.
   The above display conventions apply even when there is a display
 table, for any character whose entry in the active display table is
 @code{nil}.  Thus, when you set up a display table, you need only
-specify the characters for which you want special behavior.
+specify the characters for which you want special display behavior.
 
   The following variables affect how certain characters are displayed
 on the screen.  Since they change the number of columns the characters
@@ -7649,7 +7650,8 @@ command @code{tab-to-tab-stop}.  @xref{Indent Tabs}.
 (@pxref{Char-Tables}), with @code{display-table} as its subtype, which
 is used to override the usual character display conventions.  This
 section describes how to make, inspect, and assign elements to a
-display table object.
+display table object.  The next section (@pxref{Active Display Table})
+describes the various standard display tables and their precedence.
 
 @defun make-display-table
 This creates and returns a display table.  The table initially has
diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi
index be0c835..8b440c7 100644
--- a/doc/lispref/elisp.texi
+++ b/doc/lispref/elisp.texi
@@ -197,6 +197,7 @@ To view this manual in other formats, click
 
 * Loading::                 Reading files of Lisp code into Lisp.
 * Byte Compilation::        Compilation makes programs run faster.
+* Native Compilation::      Compile Lisp into native machine code.
 * Debugging::               Tools and tips for debugging Lisp programs.
 
 * Read and Print::          Converting Lisp objects to text and back.
@@ -646,6 +647,11 @@ Byte Compilation
 * Byte-Code Objects::       The data type used for byte-compiled functions.
 * Disassembly::             Disassembling byte-code; how to read byte-code.
 
+Native Compilation
+
+* Native-Compilation Functions::  Functions to natively-compile Lisp.
+* Native-Compilation Variables::  Variables controlling native compilation.
+
 Debugging Lisp Programs
 
 * Debugger::                A debugger for the Emacs Lisp evaluator.
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 2033177..5238597 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -718,7 +718,7 @@ Emacs can then detect the first attempt to modify a buffer 
visiting a
 file that is locked by another Emacs job, and ask the user what to do.
 The file lock is really a file, a symbolic link with a special name,
 stored in the same directory as the file you are editing.  The name is
-constructed by prepending @file{.#} to the filename of the buffer.
+constructed by prepending @file{.#} to the file name of the buffer.
 The target of the symbolic link will be of the form
 @code{@var{user}@@@var{host}.@var{pid}:@var{boot}}, where @var{user}
 is replaced with the current username (from @code{user-login-name}),
@@ -1932,7 +1932,7 @@ is a symbolic link and @var{flag} is @code{nofollow}.
 
 @defun set-file-extended-attributes filename attribute-alist
 This function sets the Emacs-recognized extended file attributes for
-@code{filename}.  The second argument @var{attribute-alist} should be
+@var{filename}.  The second argument @var{attribute-alist} should be
 an alist of the same form returned by @code{file-extended-attributes}.
 The return value is @code{t} if the attributes are successfully set,
 otherwise it is @code{nil}.
@@ -2129,6 +2129,25 @@ the period that delimits the extension, and if 
@var{filename} has no
 extension, the value is @code{""}.
 @end defun
 
+@defun file-name-with-extension filename extension
+This function returns @var{filename} with its extension set to
+@var{extension}.  A single leading dot in the @var{extension} will be
+stripped if there is one.  For example:
+
+@example
+(file-name-with-extension "file" "el")
+     @result{} "file.el"
+(file-name-with-extension "file" ".el")
+     @result{} "file.el"
+(file-name-with-extension "file.c" "el")
+     @result{} "file.el"
+@end example
+
+Note that this function will error if @var{filename} or
+@var{extension} are empty, or if the @var{filename} is shaped like a
+directory (i.e., if @code{directory-name-p} returns non-@code{nil}).
+@end defun
+
 @defun file-name-sans-extension filename
 This function returns @var{filename} minus its extension, if any.  The
 version/backup part, if present, is only removed if the file has an
@@ -2415,7 +2434,7 @@ might begin with a literal @samp{~}, you can use 
@code{(concat
 (file-name-as-directory directory) filename)} instead of
 @code{(expand-file-name filename directory)}.
 
-Filenames containing @samp{.} or @samp{..} are simplified to their
+File names containing @samp{.} or @samp{..} are simplified to their
 canonical form:
 
 @example
@@ -3457,11 +3476,11 @@ identifies the remote system.
 
 This identifier string can include a host name and a user name, as
 well as characters designating the method used to access the remote
-system.  For example, the remote identifier string for the filename
+system.  For example, the remote identifier string for the file name
 @code{/sudo::/some/file} is @code{/sudo:root@@localhost:}.
 
 If @code{file-remote-p} returns the same identifier for two different
-filenames, that means they are stored on the same file system and can
+file names, that means they are stored on the same file system and can
 be accessed locally with respect to each other.  This means, for
 example, that it is possible to start a remote process accessing both
 files at the same time.  Implementers of file name handlers need to
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index a9d20c5..25706be 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -2023,8 +2023,8 @@ the @sc{cdr} of the cell is either @code{t} or 
@code{top-only}.
 
 The parameters described below provide support for resizing a frame by
 dragging its internal borders with the mouse.  They also allow moving a
-frame with the mouse by dragging the header line of its topmost or the
-mode line of its bottommost window.
+frame with the mouse by dragging the header or tab line of its topmost
+or the mode line of its bottommost window.
 
 These parameters are mostly useful for child frames (@pxref{Child
 Frames}) that come without window manager decorations.  If necessary,
@@ -2041,6 +2041,11 @@ borders, if present, with the mouse.
 If non-@code{nil}, the frame can be moved with the mouse by dragging the
 header line of its topmost window.
 
+@vindex drag-with-tab-line@r{, a frame parameter}
+@item drag-with-tab-line
+If non-@code{nil}, the frame can be moved with the mouse by dragging the
+tab line of its topmost window.
+
 @vindex drag-with-mode-line@r{, a frame parameter}
 @item drag-with-mode-line
 If non-@code{nil}, the frame can be moved with the mouse by dragging the
diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi
index 298bec5..a788852 100644
--- a/doc/lispref/help.texi
+++ b/doc/lispref/help.texi
@@ -818,7 +818,7 @@ summaries of using those functions.  The optional argument
 @var{functions} is a list whose elements are of the form:
 
 @lisp
-(@var{func} @var{keyword} @var{val} @dots{})
+(@var{func} [@var{keyword} @var{val}]@dots{})
 @end lisp
 
 The following keywords are recognized:
@@ -839,7 +839,7 @@ evaluated, and the result used.  For instance:
 @end example
 
 @noindent
-will be printed as
+will result in:
 
 @example
 (concat "foo" "bar" "zot")
@@ -866,13 +866,14 @@ should be included.
 @end example
 
 @item :no-eval*
-Like @code{:no-eval}, but alaways inserts @samp{[it depends]} as the
-result.
+Like @code{:no-eval}, but always inserts @samp{[it depends]} as the
+result.  For instance:
 
 @example
 :no-eval* (buffer-string)
 @end example
 
+@noindent
 will result in:
 
 @example
@@ -894,17 +895,26 @@ Used to output the result from non-evaluating example 
forms.
 
 @item :eg-result
 Used to output an example result from non-evaluating example forms.
+For instance:
 
 @example
 :no-eval (looking-at "f[0-9]")
 :eg-result t
 @end example
 
+@noindent
+will result in:
+
+@example
+(looking-at "f[0-9]")
+eg. @click{} t
+@end example
+
 @item :result-string
 @itemx :eg-result-string
 These two are the same as @code{:result} and @code{:eg-result},
 respectively, but are inserted as is.  This is useful when the result
-is unreadable or should be on a particular form:
+is unreadable or should be of a particular form:
 
 @example
 :no-eval (find-file "/tmp/foo")
@@ -951,7 +961,7 @@ sections.
 
 @defun shortdoc-add-function shortdoc-add-function group section elem
 Lisp packages can add functions to groups with this command.  Each
-@var{elem} should be a function descriptions, as described above.
+@var{elem} should be a function description, as described above.
 @var{group} is the function group, and @var{section} is what section
 in the function group to insert the function into.
 
diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index 4150a2b..0e250d0 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -1429,7 +1429,7 @@ other words, if a module function wants to call Lisp 
functions or
 Emacs primitives, convert @code{emacs_value} objects to and from C
 datatypes (@pxref{Module Values}), or interact with Emacs in any other
 way, some call from Emacs to @code{emacs_module_init} or to a module
-function must be in the call stack.  Module function may not interact
+function must be in the call stack.  Module functions may not interact
 with Emacs while garbage collection is running; @pxref{Garbage
 Collection}.  They may only interact with Emacs from Lisp interpreter
 threads (including the main thread) created by Emacs; @pxref{Threads}.
diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi
index e68a1ef..4d683da 100644
--- a/doc/lispref/loading.texi
+++ b/doc/lispref/loading.texi
@@ -71,7 +71,11 @@ forms in it, and closes the file.
 To find the file, @code{load} first looks for a file named
 @file{@var{filename}.elc}, that is, for a file whose name is
 @var{filename} with the extension @samp{.elc} appended.  If such a
-file exists, it is loaded.  If there is no file by that name, then
+file exists, and Emacs was compiled with native-compilation support
+(@pxref{Native Compilation}), @code{load} attempts to find a
+corresponding @samp{.eln} file, and if found, loads it instead of
+@file{@var{filename}.elc}.  Otherwise, it loads
+@file{@var{filename}.elc}.  If there is no file by that name, then
 @code{load} looks for a file named @file{@var{filename}.el}.  If that
 file exists, it is loaded.  If Emacs was compiled with support for
 dynamic modules (@pxref{Dynamic Modules}), @code{load} next looks for
@@ -109,6 +113,8 @@ explicit directory name.
 If the option @code{load-prefer-newer} is non-@code{nil}, then when
 searching suffixes, @code{load} selects whichever version of a file
 (@samp{.elc}, @samp{.el}, etc.)@: has been modified most recently.
+In this case, @code{load} doesn't load the @samp{.eln}
+natively-compiled file even if it exists.
 
 If @var{filename} is a relative file name, such as @file{foo} or
 @file{baz/foo.bar}, @code{load} searches for the file using the variable
@@ -153,7 +159,8 @@ during compilation.  @xref{Compiling Macros}.
 
 Messages like @samp{Loading foo...} and @samp{Loading foo...done} appear
 in the echo area during loading unless @var{nomessage} is
-non-@code{nil}.
+non-@code{nil}.  If a natively-compiled @samp{.eln} file is loaded,
+the message says so.
 
 @cindex load errors
 Any unhandled errors while loading a file terminate loading.  If the
@@ -430,6 +437,28 @@ optional argument @code{stringp} is non-@code{nil}, it 
instead returns
 the shadowed files as a string.
 @end deffn
 
+  If Emacs was compiled with support for native compilation
+(@pxref{Native Compilation}), then when a @samp{.elc} byte-compiled
+file is found by searching @code{load-path}, Emacs will try to look
+for a corresponding @samp{.eln} file holding the corresponding
+natively-compiled code.  The natively-compiled files are looked up in
+the directories listed by the @code{native-comp-eln-load-path}.
+
+@vindex comp-native-version-dir
+@defvar native-comp-eln-load-path
+This variable holds a list of directories where Emacs looks for
+natively-compiled @samp{.eln} files.  File names in the list that are
+not absolute are interpreted as relative to @code{invocation-directory}
+(@pxref{System Environment}).  The last directory in the list is the
+system directory, i.e.@: the directory with @samp{.eln} files
+installed by the Emacs build and installation procedure.  In each of
+the directories in the list, Emacs looks for @samp{.eln} files in a
+subdirectory whose name is constructed from the Emacs version and an
+8-character hash that depends on the current native-compilation
+@acronym{ABI}; the name of this subdirectory is stored in the variable
+@code{comp-native-version-dir}.
+@end defvar
+
 @node Loading Non-ASCII
 @section Loading Non-@acronym{ASCII} Characters
 @cindex loading, and non-ASCII characters
diff --git a/doc/lispref/macros.texi b/doc/lispref/macros.texi
index b8df363..cf23ecb 100644
--- a/doc/lispref/macros.texi
+++ b/doc/lispref/macros.texi
@@ -241,7 +241,6 @@ of constants and nonconstant parts.  To make this easier, 
use the
 @samp{`} syntax (@pxref{Backquote}).  For example:
 
 @example
-@example
 @group
 (defmacro t-becomes-nil (variable)
   `(if (eq ,variable t)
@@ -253,7 +252,6 @@ of constants and nonconstant parts.  To make this easier, 
use the
      @equiv{} (if (eq foo t) (setq foo nil))
 @end group
 @end example
-@end example
 
 @node Problems with Macros
 @section Common Problems Using Macros
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index bc8868b..196dd99 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -1188,9 +1188,9 @@ in the minibuffer to do completion.
 @defvar minibuffer-completion-table
 The value of this variable is the completion table (@pxref{Basic
 Completion}) used for completion in the minibuffer.  This is the
-global variable that contains what @code{completing-read} passes to
+buffer-local variable that contains what @code{completing-read} passes to
 @code{try-completion}.  It is used by minibuffer completion commands
-such as @code{minibuffer-complete-word}.
+such as @code{minibuffer-complete}.
 @end defvar
 
 @defvar minibuffer-completion-predicate
@@ -1201,7 +1201,7 @@ minibuffer completion functions.
 
 @defvar minibuffer-completion-confirm
 This variable determines whether Emacs asks for confirmation before
-exiting the minibuffer; @code{completing-read} binds this variable,
+exiting the minibuffer; @code{completing-read} sets this variable,
 and the function @code{minibuffer-complete-and-exit} checks the value
 before exiting.  If the value is @code{nil}, confirmation is not
 required.  If the value is @code{confirm}, the user may exit with an
@@ -1943,6 +1943,16 @@ the completion string in the @file{*Completions*} 
buffer, and
 a suffix displayed after the completion string.  This function
 takes priority over @code{annotation-function}.
 
+@item group-function
+The value should be a function for grouping the completion candidates.
+The function must take two arguments, @var{completion}, which is a
+completion candidate and @var{transform}, which is a boolean flag.  If
+@var{transform} is @code{nil}, the function must return the group
+title of the group to which the candidate belongs.  The returned title
+can also be @code{nil}.  Otherwise the function must return the
+transformed candidate.  The transformation can for example remove a
+redundant prefix, which is displayed in the group title.
+
 @item display-sort-function
 The value should be a function for sorting completions.  The function
 should take one argument, a list of completion strings, and return a
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index 88f2f14..5869f53 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -2985,10 +2985,6 @@ highlighted (instead of the entire text that 
@var{matcher} matched).
 ("fu\\(bar\\)" . 1)
 @end example
 
-If you use @code{regexp-opt} to produce the regular expression
-@var{matcher}, you can use @code{regexp-opt-depth} (@pxref{Regexp
-Functions}) to calculate the value for @var{subexp}.
-
 @item (@var{matcher} . @var{facespec})
 In this kind of element, @var{facespec} is an expression whose value
 specifies the face to use for highlighting.  In the simplest case,
@@ -3004,7 +3000,8 @@ name.
 However, @var{facespec} can also evaluate to a list of this form:
 
 @example
-(face @var{face} @var{prop1} @var{val1} @var{prop2} @var{val2}@dots{})
+(@var{subexp}
+(face @var{face} @var{prop1} @var{val1} @var{prop2} @var{val2}@dots{}))
 @end example
 
 @noindent
diff --git a/doc/lispref/numbers.texi b/doc/lispref/numbers.texi
index 4c5f7212..d28e158 100644
--- a/doc/lispref/numbers.texi
+++ b/doc/lispref/numbers.texi
@@ -237,7 +237,8 @@ precede the number and its exponent.  For example, 
@samp{1500.0},
 @samp{+15e2}, @samp{15.0e+2}, @samp{+1500000e-3}, and @samp{.15e4} are
 five ways of writing a floating-point number whose value is 1500.
 They are all equivalent.  Like Common Lisp, Emacs Lisp requires at
-least one digit after any decimal point in a floating-point number;
+least one digit after a decimal point in a floating-point number that
+does not have an exponent;
 @samp{1500.} is an integer, not a floating-point number.
 
   Emacs Lisp treats @code{-0.0} as numerically equal to ordinary zero
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 37fde0a..242c5ed 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -2369,11 +2369,17 @@ has no effect except in @sc{cbreak} mode.
 
 The argument @var{meta} controls support for input character codes
 above 127.  If @var{meta} is @code{t}, Emacs converts characters with
-the 8th bit set into Meta characters.  If @var{meta} is @code{nil},
+the 8th bit set into Meta characters, before it decodes them as needed
+(@pxref{Terminal I/O Encoding}).  If @var{meta} is @code{nil},
 Emacs disregards the 8th bit; this is necessary when the terminal uses
-it as a parity bit.  If @var{meta} is neither @code{t} nor @code{nil},
-Emacs uses all 8 bits of input unchanged.  This is good for terminals
-that use 8-bit character sets.
+it as a parity bit.  If @var{meta} is the symbol @code{encoded}, Emacs
+first decodes the characters using all the 8 bits of each byte, and
+then converts the decoded single-byte characters into Meta characters
+if they have their eighth bit set.  Finally, if @var{meta} is neither
+@code{t} nor @code{nil} nor @code{encoded}, Emacs uses all 8 bits of
+input unchanged, both before and after decoding them.  This is good
+for terminals that use 8-bit character sets and don't encode the Meta
+modifier as the eighth bit.
 
 If @var{quit-char} is non-@code{nil}, it specifies the character to
 use for quitting.  Normally this character is @kbd{C-g}.
@@ -2398,9 +2404,11 @@ flow control for output to the terminal.  This value is 
meaningful only
 when @var{interrupt} is @code{nil}.
 @item meta
 is @code{t} if Emacs treats the eighth bit of input characters as
-the meta bit; @code{nil} means Emacs clears the eighth bit of every
-input character; any other value means Emacs uses all eight bits as the
-basic character code.
+the Meta bit before decoding input; @code{encoded} if Emacs treats the
+eighth bit of the decoded single-byte characters as the Meta bit;
+@code{nil} if Emacs clears the eighth bit of every input character;
+any other value means Emacs uses all eight bits as the basic character
+code.
 @item quit
 is the character Emacs currently uses for quitting, usually @kbd{C-g}.
 @end table
diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
index 16a8e56..1d3e2d9 100644
--- a/doc/lispref/searching.texi
+++ b/doc/lispref/searching.texi
@@ -251,6 +251,11 @@ matches in the target buffer are highlighted.  Each 
parenthesized
 sub-expression of the regexp is shown in a distinct face, which makes
 it easier to verify even very complex regexps.
 
+  Note that by default Emacs search ignores case (@pxref{Searching and
+Case}).  To enable case-sensitive regexp search and match, bind
+@code{case-fold-search} to @code{nil} around the code you want to be
+case-sensitive.
+
 @menu
 * Syntax of Regexps::       Rules for writing regular expressions.
 * Regexp Example::          Illustrates regular expression syntax.
@@ -363,7 +368,7 @@ preceding expression either once or not at all.  For 
example,
 @anchor{Non-greedy repetition}
 @item @samp{*?}, @samp{+?}, @samp{??}
 @cindex non-greedy repetition characters in regexp
-These are @dfn{non-greedy} variants of the operators @samp{*}, @samp{+}
+are @dfn{non-greedy} variants of the operators @samp{*}, @samp{+}
 and @samp{?}.  Where those operators match the largest possible
 substring (consistent with matching the entire containing expression),
 the non-greedy variants match the smallest possible substring
@@ -438,6 +443,13 @@ including newline.  However, a reversed range should 
always be from
 the letter @samp{z} to the letter @samp{a} to make it clear that it is
 not a typo; for example, @samp{[+-*/]} should be avoided, because it
 matches only @samp{/} rather than the likely-intended four characters.
+
+@item
+If the end points of a range are raw 8-bit bytes (@pxref{Text
+Representations}), or if the range start is ASCII and the end is a raw
+byte (as in @samp{[a-\377]}), the range will match only ASCII
+characters and raw 8-bit bytes, but not non-ASCII characters.  This
+feature is intended for searching text in unibyte buffers and strings.
 @end enumerate
 
 Some kinds of character alternatives are not the best style even
diff --git a/doc/lispref/syntax.texi b/doc/lispref/syntax.texi
index 2df6c15..deec3f4 100644
--- a/doc/lispref/syntax.texi
+++ b/doc/lispref/syntax.texi
@@ -572,12 +572,14 @@ The function is called by @code{syntax-ppss} 
(@pxref{Position Parse}),
 and by Font Lock mode during syntactic fontification (@pxref{Syntactic
 Font Lock}).  It is called with two arguments, @var{start} and
 @var{end}, which are the starting and ending positions of the text on
-which it should act.  It is allowed to call @code{syntax-ppss} on any
-position before @var{end}, but if a Lisp program calls
-@code{syntax-ppss} on some position and later modifies the buffer at
-some earlier position, then it is that program's responsibility to
-call @code{syntax-ppss-flush-cache} to flush the now obsolete info
-from the cache.
+which it should act.  It is allowed to arbitrarily move point within
+the region delimited by @var{start} and @var{end}; such motions don't
+need to use @code{save-excursion} (@pxref{Excursions}).  It is also
+allowed to call @code{syntax-ppss} on any position before @var{end},
+but if a Lisp program calls @code{syntax-ppss} on some position and
+later modifies the buffer at some earlier position, then it is that
+program's responsibility to call @code{syntax-ppss-flush-cache} to
+flush the now obsolete info from the cache.
 
 @strong{Caution:} When this variable is non-@code{nil}, Emacs removes
 @code{syntax-table} text properties arbitrarily and relies on
@@ -1045,6 +1047,11 @@ Given a syntax descriptor @var{desc} (a string), this 
function returns
 the corresponding raw syntax descriptor.
 @end defun
 
+@defun syntax-class-to-char syntax
+Given a raw syntax descriptor @var{syntax} (an integer), this function
+returns the corresponding syntax descriptor (a character).
+@end defun
+
 @defun syntax-after pos
 This function returns the raw syntax descriptor for the character in
 the buffer after position @var{pos}, taking account of syntax
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index 44c4b90..0c87a19 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -1118,25 +1118,32 @@ one, it rotates the kill ring to place the yanked 
string at the front.
 @end deffn
 
 @deffn Command yank-pop &optional arg
-This command replaces the just-yanked entry from the kill ring with a
-different entry from the kill ring.
-
-This works only immediately after a @code{yank} or another
-@code{yank-pop}.  At such a time, the region contains text that was just
-inserted by yanking.  @code{yank-pop} deletes that text and inserts in
-its place a different piece of killed text.  It does not add the deleted
-text to the kill ring, since it is already in the kill ring somewhere.
-It does however rotate the kill ring to place the newly yanked string at
-the front.
+When invoked immediately after a @code{yank} or another
+@code{yank-pop}, this command replaces the just-yanked entry from the
+kill ring with a different entry from the kill ring.  When this
+command is invoked like that, the region contains text that was just
+inserted by another yank command.  @code{yank-pop} deletes that text
+and inserts in its place a different piece of killed text.  It does
+not add the deleted text to the kill ring, since it is already in the
+kill ring somewhere.  It does however rotate the kill ring to place
+the newly yanked string at the front.
 
 If @var{arg} is @code{nil}, then the replacement text is the previous
 element of the kill ring.  If @var{arg} is numeric, the replacement is
 the @var{arg}th previous kill.  If @var{arg} is negative, a more recent
 kill is the replacement.
 
-The sequence of kills in the kill ring wraps around, so that after the
-oldest one comes the newest one, and before the newest one goes the
-oldest.
+The sequence of kills in the kill ring wraps around, so if
+@code{yank-pop} is invoked repeatedly and reaches the oldest kill, the
+one that comes after it is the newest one, and the one before the
+newest one is the oldest one.
+
+This command can also be invoked after a command that is not a yank
+command.  In that case, it prompts in the minibuffer for a kill-ring
+entry, with completion, and uses the kill ring elements as the
+minibuffer history (@pxref{Minibuffer History}).  This allows the user
+to interactively select one of the previous kills recorded in the kill
+ring.
 
 The return value is always @code{nil}.
 @end deffn
@@ -4159,7 +4166,7 @@ file names only:
 If the condition value is anything else, then the position is inside a
 link and the condition itself is the action code.  Clearly, you should
 specify this kind of condition only when applying the condition via a
-text or property overlay on the link text (so that it does not apply
+text or overlay property on the link text (so that it does not apply
 to the entire buffer).
 @end table
 
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index 36c68ee..54cafff 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -1034,7 +1034,7 @@ the conventional possibilities for @var{header-name}:
 
 @table @samp
 @item Author
-This line states the name and email address of at least the principal
+This header states the name and email address of at least the principal
 author of the library.  If there are multiple authors, list them on
 continuation lines led by @code{;;} and a tab or at least two spaces.
 We recommend including a contact email address, of the form
@@ -1053,8 +1053,8 @@ This header has the same format as the Author header.  It 
lists the
 person(s) who currently maintain(s) the file (respond to bug reports,
 etc.).
 
-If there is no maintainer line, the person(s) in the Author field
-is/are presumed to be the maintainers.  Some files in Emacs use
+If there is no Maintainer header, the person(s) in the Author header
+is/are presumed to be the maintainer(s).  Some files in Emacs use
 @samp{emacs-devel@@gnu.org} for the maintainer, which means the author is
 no longer responsible for the file, and that it is maintained as part
 of Emacs.
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index b25eea1..62c76f0 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -1582,6 +1582,12 @@ buffer-local binding in buffer @var{buffer}, it returns 
the default
 value (@pxref{Default Value}) of @var{variable} instead.
 @end defun
 
+@defun buffer-local-boundp variable buffer
+This returns non-@code{nil} if there's either a buffer-local binding
+of @var{variable} (a symbol) in buffer @var{buffer}, or @var{variable}
+has a global binding.
+@end defun
+
 @defun buffer-local-variables &optional buffer
 This function returns a list describing the buffer-local variables in
 buffer @var{buffer}.  (If @var{buffer} is omitted, the current buffer
@@ -1885,6 +1891,14 @@ any form of file-local variable.  For examples of why 
you might want
 to use this, @pxref{Auto Major Mode}.
 @end defvar
 
+@defvar permanently-enabled-local-variables
+Some local variable settings will, by default, be heeded even if
+@code{enable-local-variables} is @code{nil}.  By default, this is only
+the case for the @code{lexical-binding} local variable setting, but
+this can be controlled by using this variable, which is a list of
+symbols.
+@end defvar
+
 @defun hack-local-variables &optional handle-mode
 This function parses, and binds or evaluates as appropriate, any local
 variables specified by the contents of the current buffer.  The variable
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 82d2ce4..26f85df 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -1318,6 +1318,33 @@ lieu of the usual action of @code{delete-window}.  
@xref{Window
 Parameters}.
 @end deffn
 
+When @code{delete-window} deletes the selected window of its frame, it
+has to make another window the new selected window of that frame.  The
+following option allows configuring which window is chosen.
+
+@defopt delete-window-choose-selected
+This option allows specifying which window should become a frame's
+selected window after @code{delete-window} has deleted the previously
+selected one.  Possible choices are
+
+@itemize
+@item @code{mru}
+(the default) choose the most recently used window on that frame.
+
+@item @code{pos}
+choose the window comprising the frame coordinates of point of the
+previously selected window on that frame.
+
+@item @code{nil}
+choose the first window (the window returned by
+@code{frame-first-window}) on that frame.
+@end itemize
+
+A window with a non-@code{nil} @code{no-other-window} parameter is
+chosen only if all other windows on that frame have that parameter set
+to a non-@code{nil} value too.
+@end defopt
+
 @deffn Command delete-other-windows &optional window
 This function makes @var{window} fill its frame, deleting other
 windows as necessary.  If @var{window} is omitted or @code{nil}, it
@@ -1838,6 +1865,14 @@ with @var{window} as the selected window without 
needlessly running
 @code{buffer-list-update-hook}.
 @end defmac
 
+@defmac with-selected-frame frame forms@dots{}
+This macro executes @var{forms} with @var{frame} as the selected
+frame.  The value returned is the value of the last form in
+@var{forms}.  This macro saves and restores the selected frame, and
+changes the order of neither the recently selected windows nor the
+buffers in the buffer list.
+@end defmac
+
 @defun frame-selected-window &optional frame
 This function returns the window on @var{frame} that is selected
 within that frame.  @var{frame} should be a live frame; if omitted or
@@ -1999,7 +2034,7 @@ meaning as for @code{next-window}.
 criterion, without selecting it:
 
 @cindex least recently used window
-@defun get-lru-window &optional all-frames dedicated not-selected
+@defun get-lru-window &optional all-frames dedicated not-selected no-other
 This function returns a live window which is heuristically the least
 recently used.  The optional argument @var{all-frames} has
 the same meaning as in @code{next-window}.
@@ -2010,33 +2045,25 @@ window (@pxref{Dedicated Windows}) is never a candidate 
unless the
 optional argument @var{dedicated} is non-@code{nil}.  The selected
 window is never returned, unless it is the only candidate.  However, if
 the optional argument @var{not-selected} is non-@code{nil}, this
-function returns @code{nil} in that case.
+function returns @code{nil} in that case.  The optional argument
+@var{no-other}, if non-@code{nil}, means to never return a window whose
+@code{no-other-window} parameter is non-@code{nil}.
 @end defun
 
 @cindex most recently used window
-@defun get-mru-window &optional all-frames dedicated not-selected
+@defun get-mru-window &optional all-frames dedicated not-selected no-other
 This function is like @code{get-lru-window}, but it returns the most
 recently used window instead.  The meaning of the arguments is the
-same as described for @code{get-lru-window}.
+same as for @code{get-lru-window}.
 @end defun
 
 @cindex largest window
-@defun get-largest-window &optional all-frames dedicated not-selected
+@defun get-largest-window &optional all-frames dedicated not-selected no-other
 This function returns the window with the largest area (height times
-width).  The optional argument @var{all-frames} specifies the windows to
-search, and has the same meaning as in @code{next-window}.
-
-A minibuffer window is never a candidate.  A dedicated window
-(@pxref{Dedicated Windows}) is never a candidate unless the optional
-argument @var{dedicated} is non-@code{nil}.  The selected window is not
-a candidate if the optional argument @var{not-selected} is
-non-@code{nil}.  If the optional argument @var{not-selected} is
-non-@code{nil} and the selected window is the only candidate, this
-function returns @code{nil}.
-
-If there are two candidate windows of the same size, this function
-prefers the one that comes first in the cyclic ordering of windows,
-starting from the selected window.
+width).  If there are two candidate windows of the same size, it prefers
+the one that comes first in the cyclic ordering of windows, starting
+from the selected window.  The meaning of the arguments is the same as
+for @code{get-lru-window}.
 @end defun
 
 @cindex window that satisfies a predicate
@@ -2164,12 +2191,13 @@ the name of an existing buffer; if omitted or 
@code{nil}, it defaults to
 the current buffer.
 
 The replacement buffer in each window is chosen via
-@code{switch-to-prev-buffer} (@pxref{Window History}).  Any dedicated
-window displaying @var{buffer-or-name} is deleted if possible
-(@pxref{Dedicated Windows}).  If such a window is the only window on its
-frame and there are other frames on the same terminal, the frame is
-deleted as well.  If the dedicated window is the only window on the only
-frame on its terminal, the buffer is replaced anyway.
+@code{switch-to-prev-buffer} (@pxref{Window History}).  With the
+exception of side windows (@pxref{Side Windows}), any dedicated window
+displaying @var{buffer-or-name} is deleted if possible (@pxref{Dedicated
+Windows}).  If such a window is the only window on its frame and there
+are other frames on the same terminal, the frame is deleted as well.
+If the dedicated window is the only window on the only frame on its
+terminal, the buffer is replaced anyway.
 @end deffn
 
 
@@ -2986,6 +3014,8 @@ If non-@code{nil}, such an entry tells 
@code{display-buffer} to mark
 any window it creates as dedicated to its buffer (@pxref{Dedicated
 Windows}).  It does that by calling @code{set-window-dedicated-p} with
 the chosen window as first argument and the entry's value as second.
+Side windows are by default dedicated with the value @code{side}
+((@pxref{Side Window Options and Functions}).
 
 @vindex preserve-size@r{, a buffer display action alist entry}
 @item preserve-size
@@ -4034,18 +4064,19 @@ slightly different, see below.
 
    Functions supposed to remove a buffer from a window or a window from
 a frame can behave specially when a window they operate on is dedicated.
-We will distinguish three basic cases, namely where (1) the window is
+We will distinguish four basic cases, namely where (1) the window is
 not the only window on its frame, (2) the window is the only window on
-its frame but there are other frames on the same terminal left, and (3)
-the window is the only window on the only frame on the same terminal.
+its frame but there are other frames on the same terminal left, (3)
+the window is the only window on the only frame on the same terminal,
+and (4) the dedication's value is @code{side}
+(@pxref{Displaying Buffers in Side Windows}).
 
    In particular, @code{delete-windows-on} (@pxref{Deleting Windows})
-handles case (2) by deleting the associated frame and case (3) by
-showing another buffer in that frame's only window.  The function
+handles case (2) by deleting the associated frame and cases (3) and (4)
+by showing another buffer in that frame's only window.  The function
 @code{replace-buffer-in-windows} (@pxref{Buffers and Windows}) which is
 called when a buffer gets killed, deletes the window in case (1) and
 behaves like @code{delete-windows-on} otherwise.
-@c FIXME: Does replace-buffer-in-windows _delete_ a window in case (1)?
 
    When @code{bury-buffer} (@pxref{Buffer List}) operates on the
 selected window (which shows the buffer that shall be buried), it
@@ -4308,6 +4339,25 @@ means to use a slot following (that is, below or on the 
right of) the
 middle slot.  Hence, all windows on a specific side are ordered by their
 @code{slot} value.  If unspecified, the window is located in the middle
 of the specified side.
+
+@item dedicated
+The dedicated flag (@pxref{Dedicated Windows}) has a slightly different
+meaning for side windows.  When a side window is created, that flag is
+set to the value @code{side} to prevent @code{display-buffer} to use the
+window in other action functions.  Its value persists across invocations
+of @code{quit-window}, @code{kill-buffer}, @code{previous-buffer} and
+@code{next-buffer}.
+
+In particular, these commands will refrain from showing, in a side
+window, buffers that have not been displayed in that window before.
+They will also refrain from having a normal, non-side window show a
+buffer that has been already displayed in a side window.  A notable
+exception to the latter rule occurs when an application, after
+displaying a buffer, resets that buffer’s local variables.  To override
+these rules and always delete a side window with @code{quit-window} or
+@code{kill-buffer}, and eventually prevent the use of
+@code{previous-buffer} and @code{next-buffer}, set this value to
+@code{t} or specify a value via @code{display-buffer-mark-dedicated}.
 @end table
 
 If you specify the same slot on the same side for two or more different
@@ -4328,16 +4378,6 @@ Functions}) unless it is explicitly specified as target 
of that
 action.  Note also that @code{delete-other-windows} cannot make a side
 window the only window on its frame (@pxref{Deleting Windows}).
 
-   Once set up, side windows also change the behavior of the commands
-@code{switch-to-prev-buffer} and @code{switch-to-next-buffer}
-(@pxref{Window History}).  In particular, these commands will refrain
-from showing, in a side window, buffers that have not been displayed in
-that window before.  They will also refrain from having a normal,
-non-side window show a buffer that has been already displayed in a side
-window.  A notable exception to the latter rule occurs when an
-application, after displaying a buffer, resets that buffer's local
-variables.
-
 
 @node Side Window Options and Functions
 @subsection Side Window Options and Functions
diff --git a/doc/man/emacs.1.in b/doc/man/emacs.1.in
index da912bd..290be60 100644
--- a/doc/man/emacs.1.in
+++ b/doc/man/emacs.1.in
@@ -197,7 +197,7 @@ searches for Lisp files.
 .\" START DELETING HERE IF YOU'RE NOT USING X
 .SS Using Emacs with X
 .I Emacs
-has been tailored to work well with the X window system.
+has been tailored to work well with the X Window System.
 If you run
 .I Emacs
 from under X windows, it will create its own X window to
@@ -566,7 +566,7 @@ distribution.
 /usr/local/share/info \(em files for the Info documentation browser.
 The complete text of the Emacs reference manual is included in a
 convenient tree structured form.
-Also includes the Emacs Lisp Reference Manual, useful to anyone
+This includes the Emacs Lisp Reference Manual, useful to anyone
 wishing to write programs in the Emacs Lisp extension language,
 and the Introduction to Programming in Emacs Lisp.
 
diff --git a/doc/man/etags.1 b/doc/man/etags.1
index c5c15fb..cbd3c1a 100644
--- a/doc/man/etags.1
+++ b/doc/man/etags.1
@@ -1,5 +1,5 @@
 .\" See section COPYING for copyright and redistribution information.
-.TH ETAGS 1 "2019-06-24" "GNU Tools" "GNU"
+.TH ETAGS 1 "2021-03-30" "GNU Tools" "GNU"
 .de BP
 .sp
 .ti -.2i
@@ -50,9 +50,9 @@ format understood by
 .BR vi ( 1 )\c
 \&.  Both forms of the program understand
 the syntax of C, Objective C, C++, Java, Fortran, Ada, Cobol, Erlang,
-Forth, Go, HTML, LaTeX, Emacs Lisp/Common Lisp, Lua, Makefile, Pascal, Perl,
-Ruby, PHP, PostScript, Python, Prolog, Scheme and
-most assembler\-like syntaxes.
+Forth, Go, HTML, LaTeX, Emacs Lisp/Common Lisp, Lua, Makefile, Mercury, Pascal,
+Perl, Ruby, Rust, PHP, PostScript, Python, Prolog, Scheme and most
+assembler\-like syntaxes.
 Both forms read the files specified on the command line, and write a tag
 table (defaults: \fBTAGS\fP for \fBetags\fP, \fBtags\fP for
 \fBctags\fP) in the current working directory.
@@ -91,6 +91,9 @@ Only \fBctags\fP accepts this option.
 In C and derived languages, create tags for function declarations,
 and create tags for extern variables unless \-\-no\-globals is used.
 In Lisp, create tags for (defvar foo) declarations.
+In Mercury, declarations start a line with "\|\fB:-\fP\|" and are always
+tagged.  In addition, this option tags predicates or functions in first
+rules of clauses, as in Prolog.
 .TP
 .B \-D, \-\-no\-defines
 Do not create tag entries for C preprocessor constant definitions
@@ -125,10 +128,14 @@ final brace of a function or structure definition in C 
and C++.
 Parse the following files according to the given language.  More than
 one such options may be intermixed with filenames.  Use \fB\-\-help\fP
 to get a list of the available languages and their default filename
-extensions.  The "auto" language can be used to restore automatic
-detection of language based on the file name.  The "none"
-language may be used to disable language parsing altogether; only
-regexp matching is done in this case (see the \fB\-\-regex\fP option).
+extensions.  For example, as Mercury and Objective-C have same
+filename extension \fI.m\fP, a test based on contents tries to detect
+the language.  If this test fails, \fB\-\-language=\fP\fImercury\fP or
+\fB\-\-language=\fP\fIobjc\fP should be used.
+The "auto" language can be used to restore automatic detection of language
+based on the file name.  The "none" language may be used to disable language
+parsing altogether; only regexp matching is done in this case (see the
+\fB\-\-regex\fP option).
 .TP
 .B \-\-members
 Create tag entries for variables that are members of structure-like
diff --git a/doc/misc/autotype.texi b/doc/misc/autotype.texi
index 72ba736..5f9dc01 100644
--- a/doc/misc/autotype.texi
+++ b/doc/misc/autotype.texi
@@ -579,7 +579,7 @@ table:
 @vindex skeleton-transformation
 Insert string or character.  Literal strings and characters are passed through
 @code{skeleton-transformation} when that is non-@code{nil}.
-@item @code{?\n}
+@item @code{\n}
 @c ??? something seems very wrong here.
 Insert a newline and align under current line, but not if this is the
 last element of a skeleton and the newline would be inserted at end of
diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi
index b409c1f..e11267e 100644
--- a/doc/misc/calc.texi
+++ b/doc/misc/calc.texi
@@ -588,7 +588,7 @@ there are Quick mode, Keypad mode, and Embedded mode.
 * Other C-x * Commands::
 @end menu
 
-@node Starting Calc, The Standard Interface, Using Calc, Using Calc
+@node Starting Calc
 @subsection Starting Calc
 
 @noindent
@@ -619,7 +619,7 @@ type the full command (like @kbd{calc-keypad}) and press 
Return.
 The same commands (like @kbd{C-x * c} or @kbd{C-x * *}) that start
 the Calculator also turn it off if it is already on.
 
-@node The Standard Interface, Quick Mode Overview, Starting Calc, Using Calc
+@node The Standard Interface
 @subsection The Standard Calc Interface
 
 @noindent
@@ -713,7 +713,7 @@ switch you to the Calc Trail window.  So @kbd{C-x * o} is a 
handy
 way to switch out of Calc momentarily to edit your file; you can then
 type @kbd{C-x * c} to switch back into Calc when you are done.
 
-@node Quick Mode Overview, Keypad Mode Overview, The Standard Interface, Using 
Calc
+@node Quick Mode Overview
 @subsection Quick Mode (Overview)
 
 @noindent
@@ -736,7 +736,7 @@ go into regular Calc (with @kbd{C-x * c}) to change the 
mode settings.
 @c [fix-ref Quick Calculator mode]
 @xref{Quick Calculator}, for further information.
 
-@node Keypad Mode Overview, Standalone Operation, Quick Mode Overview, Using 
Calc
+@node Keypad Mode Overview
 @subsection Keypad Mode (Overview)
 
 @noindent
@@ -814,7 +814,7 @@ left, the stack in the lower right, and the trail on top.
 @c [fix-ref Keypad Mode]
 @xref{Keypad Mode}, for further information.
 
-@node Standalone Operation, Embedded Mode Overview, Keypad Mode Overview, 
Using Calc
+@node Standalone Operation
 @subsection Standalone Operation
 
 @noindent
@@ -841,7 +841,7 @@ In standalone operation, quitting the Calculator (by 
pressing
 @kbd{q} or clicking on the keypad @key{EXIT} button) quits Emacs
 itself.
 
-@node Embedded Mode Overview, Other C-x * Commands, Standalone Operation, 
Using Calc
+@node Embedded Mode Overview
 @subsection Embedded Mode (Overview)
 
 @noindent
@@ -972,7 +972,7 @@ A slope of one-third corresponds to an angle of 
18.4349488229 degrees.
 @c [fix-ref Embedded Mode]
 @xref{Embedded Mode}, for full details.
 
-@node Other C-x * Commands,  , Embedded Mode Overview, Using Calc
+@node Other C-x * Commands
 @subsection Other @kbd{C-x *} Commands
 
 @noindent
@@ -1329,7 +1329,7 @@ Calc.
 * Answers to Exercises::
 @end menu
 
-@node Basic Tutorial, Arithmetic Tutorial, Tutorial, Tutorial
+@node Basic Tutorial
 @section Basic Tutorial
 
 @noindent
@@ -1344,7 +1344,7 @@ to control various modes of the Calculator.
 * Modes Tutorial::          Common mode-setting commands.
 @end menu
 
-@node RPN Tutorial, Algebraic Tutorial, Basic Tutorial, Basic Tutorial
+@node RPN Tutorial
 @subsection RPN Calculations and the Stack
 
 @cindex RPN notation
@@ -1738,7 +1738,7 @@ Another common idiom is @kbd{M-0 @key{DEL}}, which clears 
the stack.
 (The @kbd{M-0} numeric prefix tells @key{DEL} to operate on the
 entire stack.)
 
-@node Algebraic Tutorial, Undo Tutorial, RPN Tutorial, Basic Tutorial
+@node Algebraic Tutorial
 @subsection Algebraic-Style Calculations
 
 @noindent
@@ -2038,7 +2038,7 @@ You can also ``unstore'' a variable when you are through 
with it:
 We will encounter formulas involving variables and functions again
 when we discuss the algebra and calculus features of the Calculator.
 
-@node Undo Tutorial, Modes Tutorial, Algebraic Tutorial, Basic Tutorial
+@node Undo Tutorial
 @subsection Undo and Redo
 
 @noindent
@@ -2175,7 +2175,7 @@ new number.  This works for formulas, vectors, and all 
other types
 of values you can put on the stack.  The @kbd{`} key also works
 during entry of a number or algebraic formula.
 
-@node Modes Tutorial,  , Undo Tutorial, Basic Tutorial
+@node Modes Tutorial
 @subsection Mode-Setting Commands
 
 @noindent
@@ -2655,7 +2655,7 @@ again when we change to Fraction mode.  All @samp{=>} 
expressions
 on the stack are recomputed every time you change any mode that
 might affect their values.
 
-@node Arithmetic Tutorial, Vector/Matrix Tutorial, Basic Tutorial, Tutorial
+@node Arithmetic Tutorial
 @section Arithmetic Tutorial
 
 @noindent
@@ -3041,7 +3041,7 @@ like @code{pv}, @code{rate}, and @code{sln}).
 @xref{Binary Functions}, to read about the commands for operating
 on binary numbers (like @code{and}, @code{xor}, and @code{lsh}).
 
-@node Vector/Matrix Tutorial, Types Tutorial, Arithmetic Tutorial, Tutorial
+@node Vector/Matrix Tutorial
 @section Vector/Matrix Tutorial
 
 @noindent
@@ -3056,7 +3056,7 @@ a vector as a list of objects.
 * List Tutorial::
 @end menu
 
-@node Vector Analysis Tutorial, Matrix Tutorial, Vector/Matrix Tutorial, 
Vector/Matrix Tutorial
+@node Vector Analysis Tutorial
 @subsection Vector Analysis
 
 @noindent
@@ -3181,7 +3181,7 @@ probabilities for the particle to be at the corresponding 
positions.
 Find the average position of the particle.
 @xref{Vector Answer 2, 2}. (@bullet{})
 
-@node Matrix Tutorial, List Tutorial, Vector Analysis Tutorial, Vector/Matrix 
Tutorial
+@node Matrix Tutorial
 @subsection Matrices
 
 @noindent
@@ -3507,7 +3507,7 @@ $$
 @noindent
 @xref{Matrix Answer 3, 3}. (@bullet{})
 
-@node List Tutorial,  , Matrix Tutorial, Vector/Matrix Tutorial
+@node List Tutorial
 @subsection Vectors as Lists
 
 @noindent
@@ -4214,7 +4214,7 @@ walk to walk a unit distance, but in a random direction, 
at each step.
 (Hint:  The @code{sincos} function returns a vector of the cosine and
 sine of an angle.)  @xref{List Answer 14, 14}. (@bullet{})
 
-@node Types Tutorial, Algebra Tutorial, Vector/Matrix Tutorial, Tutorial
+@node Types Tutorial
 @section Types Tutorial
 
 @noindent
@@ -4738,7 +4738,7 @@ Power Pill he eats doubles his speed.  How many Power 
Pills can he
 swallow and still travel legally on most US highways?
 @xref{Types Answer 15, 15}. (@bullet{})
 
-@node Algebra Tutorial, Programming Tutorial, Types Tutorial, Tutorial
+@node Algebra Tutorial
 @section Algebra and Calculus Tutorial
 
 @noindent
@@ -4751,7 +4751,7 @@ formulas.
 * Rewrites Tutorial::
 @end menu
 
-@node Basic Algebra Tutorial, Rewrites Tutorial, Algebra Tutorial, Algebra 
Tutorial
+@node Basic Algebra Tutorial
 @subsection Basic Algebra
 
 @noindent
@@ -5246,7 +5246,7 @@ details and examples.
 @c hard exercise: simplify (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1)
 @c                to 2^((n-1)*(r-1)).
 
-@node Rewrites Tutorial,  , Basic Algebra Tutorial, Algebra Tutorial
+@node Rewrites Tutorial
 @subsection Rewrite Rules
 
 @noindent
@@ -5687,7 +5687,7 @@ a nasty surprise when you use Calc to balance your 
checkbook!)
 
 @xref{Rewrite Rules}, for the whole story on rewrite rules.
 
-@node Programming Tutorial, Answers to Exercises, Algebra Tutorial, Tutorial
+@node Programming Tutorial
 @section Programming Tutorial
 
 @noindent
@@ -6346,7 +6346,7 @@ The rest of this manual tells the whole story.
 @c Volume II of this manual, the @dfn{Calc Reference}, tells the whole story.
 
 @page
-@node Answers to Exercises,  , Programming Tutorial, Tutorial
+@node Answers to Exercises
 @section Answers to Exercises
 
 @noindent
@@ -6433,7 +6433,7 @@ This section includes answers to all the exercises in the 
Calc tutorial.
 \gdef\chapternofonts{\let\write=\skipwrite\oldchapternofonts}
 @end tex
 
-@node RPN Answer 1, RPN Answer 2, Answers to Exercises, Answers to Exercises
+@node RPN Answer 1
 @subsection RPN Tutorial Exercise 1
 
 @noindent
@@ -6443,7 +6443,7 @@ The result is
 @texline @math{1 - (2 \times (3 + 4)) = -13}.
 @infoline @expr{1 - (2 * (3 + 4)) = -13}.
 
-@node RPN Answer 2, RPN Answer 3, RPN Answer 1, Answers to Exercises
+@node RPN Answer 2
 @subsection RPN Tutorial Exercise 2
 
 @noindent
@@ -6500,7 +6500,7 @@ advantage of using only three stack levels.  But since 
Calc's stack
 can grow arbitrarily large this isn't really an issue.  Which method
 you choose is purely a matter of taste.
 
-@node RPN Answer 3, RPN Answer 4, RPN Answer 2, Answers to Exercises
+@node RPN Answer 3
 @subsection RPN Tutorial Exercise 3
 
 @noindent
@@ -6531,7 +6531,7 @@ Similarly, @kbd{M-@key{TAB}} gives you access to the 
number in level 3.
 @end group
 @end smallexample
 
-@node RPN Answer 4, Algebraic Answer 1, RPN Answer 3, Answers to Exercises
+@node RPN Answer 4
 @subsection RPN Tutorial Exercise 4
 
 @noindent
@@ -6569,7 +6569,7 @@ enough that Calc provides a special key, 
@kbd{M-@key{DEL}}, to do just that.
 @kbd{M-@key{DEL}} is just like @kbd{@key{TAB} @key{DEL}}, except that it 
doesn't exhibit
 the ``feature'' that tripped poor Joe.)
 
-@node Algebraic Answer 1, Algebraic Answer 2, RPN Answer 4, Answers to 
Exercises
+@node Algebraic Answer 1
 @subsection Algebraic Entry Tutorial Exercise 1
 
 @noindent
@@ -6582,7 +6582,7 @@ Or, RPN style, @kbd{0.5 ^}.
 a closer equivalent, since @samp{9^0.5} yields @expr{3.0} whereas
 @samp{sqrt(9)} and @samp{9^1:2} yield the exact integer @expr{3}.)
 
-@node Algebraic Answer 2, Algebraic Answer 3, Algebraic Answer 1, Answers to 
Exercises
+@node Algebraic Answer 2
 @subsection Algebraic Entry Tutorial Exercise 2
 
 @noindent
@@ -6591,7 +6591,7 @@ name with @samp{1+y} as its argument.  Assigning a value 
to a variable
 has no relation to a function by the same name.  Joe needed to use an
 explicit @samp{*} symbol here:  @samp{2 x*(1+y)}.
 
-@node Algebraic Answer 3, Modes Answer 1, Algebraic Answer 2, Answers to 
Exercises
+@node Algebraic Answer 3
 @subsection Algebraic Entry Tutorial Exercise 3
 
 @noindent
@@ -6608,7 +6608,7 @@ multiply infinity by zero, Calc uses another special new 
symbol to
 show that the answer is ``indeterminate.''  @xref{Infinities}, for
 further discussion of infinite and indeterminate values.
 
-@node Modes Answer 1, Modes Answer 2, Algebraic Answer 3, Answers to Exercises
+@node Modes Answer 1
 @subsection Modes Tutorial Exercise 1
 
 @noindent
@@ -6669,7 +6669,7 @@ in binary, octal, or hexadecimal is also exact in 
decimal, so the kinds
 of problems we saw in this exercise are likely to be severe only when
 you use a relatively unusual radix like 3.
 
-@node Modes Answer 2, Modes Answer 3, Modes Answer 1, Answers to Exercises
+@node Modes Answer 2
 @subsection Modes Tutorial Exercise 2
 
 If the radix is 15 or higher, we can't use the letter @samp{e} to mark
@@ -6689,7 +6689,7 @@ it by the floating-point @samp{16#1.23}).  While this 
wouldn't normally
 matter for display purposes, it could give you a nasty surprise if you
 copied that number into a file and later moved it back into Calc.
 
-@node Modes Answer 3, Modes Answer 4, Modes Answer 2, Answers to Exercises
+@node Modes Answer 3
 @subsection Modes Tutorial Exercise 3
 
 @noindent
@@ -6731,7 +6731,7 @@ exactly was the quantity 45 degrees, so the precision 
must be raised
 before anything is done after the number 45 has been entered in order
 for the higher precision to be meaningful.
 
-@node Modes Answer 4, Arithmetic Answer 1, Modes Answer 3, Answers to Exercises
+@node Modes Answer 4
 @subsection Modes Tutorial Exercise 4
 
 @noindent
@@ -6752,7 +6752,7 @@ Also, rational numbers cannot express the results of all 
calculations.
 There is no fractional form for the square root of two, so if you type
 @w{@kbd{2 Q}}, Calc has no choice but to give you a floating-point answer.
 
-@node Arithmetic Answer 1, Arithmetic Answer 2, Modes Answer 4, Answers to 
Exercises
+@node Arithmetic Answer 1
 @subsection Arithmetic Tutorial Exercise 1
 
 @noindent
@@ -6772,7 +6772,7 @@ produces the exact fraction @expr{123456789:2}, which can 
be rounded
 down by the @kbd{F} command without ever switching to floating-point
 format.
 
-@node Arithmetic Answer 2, Vector Answer 1, Arithmetic Answer 1, Answers to 
Exercises
+@node Arithmetic Answer 2
 @subsection Arithmetic Tutorial Exercise 2
 
 @noindent
@@ -6784,7 +6784,7 @@ or (when in Fraction mode) the reciprocal of an integer.  
But there is
 no efficient way to search the space of all possible rational numbers
 for an exact answer, so Calc doesn't try.
 
-@node Vector Answer 1, Vector Answer 2, Arithmetic Answer 2, Answers to 
Exercises
+@node Vector Answer 1
 @subsection Vector Tutorial Exercise 1
 
 @noindent
@@ -6804,7 +6804,7 @@ by its length:  @kbd{@key{RET} A /}.
 The final @kbd{A} command shows that the normalized vector does
 indeed have unit length.
 
-@node Vector Answer 2, Matrix Answer 1, Vector Answer 1, Answers to Exercises
+@node Vector Answer 2
 @subsection Vector Tutorial Exercise 2
 
 @noindent
@@ -6813,14 +6813,14 @@ positions times their corresponding probabilities.  
This is the
 definition of the dot product operation.  So all you need to do
 is to put the two vectors on the stack and press @kbd{*}.
 
-@node Matrix Answer 1, Matrix Answer 2, Vector Answer 2, Answers to Exercises
+@node Matrix Answer 1
 @subsection Matrix Tutorial Exercise 1
 
 @noindent
 The trick is to multiply by a vector of ones.  Use @kbd{r 4 [1 1 1] *} to
 get the row sum.  Similarly, use @kbd{[1 1] r 4 *} to get the column sum.
 
-@node Matrix Answer 2, Matrix Answer 3, Matrix Answer 1, Answers to Exercises
+@node Matrix Answer 2
 @subsection Matrix Tutorial Exercise 2
 
 @ifnottex
@@ -6866,7 +6866,7 @@ mode:
 
 Type @kbd{d N} to return to Normal display mode afterwards.
 
-@node Matrix Answer 3, List Answer 1, Matrix Answer 2, Answers to Exercises
+@node Matrix Answer 3
 @subsection Matrix Tutorial Exercise 3
 
 @noindent
@@ -6984,7 +6984,7 @@ the original system of equations to see how well they 
match.
 This is reasonably close to our original @expr{B} vector,
 @expr{[6, 2, 3, 11]}.
 
-@node List Answer 1, List Answer 2, Matrix Answer 3, Answers to Exercises
+@node List Answer 1
 @subsection List Tutorial Exercise 1
 
 @noindent
@@ -7016,7 +7016,7 @@ vector.
 @end group
 @end smallexample
 
-@node List Answer 2, List Answer 3, List Answer 1, Answers to Exercises
+@node List Answer 2
 @subsection List Tutorial Exercise 2
 
 @noindent
@@ -7099,7 +7099,7 @@ arithmetic functions!
 In fact, there is a built-in @kbd{a F} command that does least-squares
 fits.  @xref{Curve Fitting}.
 
-@node List Answer 3, List Answer 4, List Answer 2, Answers to Exercises
+@node List Answer 3
 @subsection List Tutorial Exercise 3
 
 @noindent
@@ -7143,7 +7143,7 @@ how many numbers are in this list.  Then we could type:
 You could also type @kbd{& ^} to take the reciprocal of 9 and
 then raise the number to that power.)
 
-@node List Answer 4, List Answer 5, List Answer 3, Answers to Exercises
+@node List Answer 4
 @subsection List Tutorial Exercise 4
 
 @noindent
@@ -7183,7 +7183,7 @@ The first divisor function is the sum of the divisors.
 Once again, the last two steps just compute a dot product for which
 a simple @kbd{*} would have worked equally well.
 
-@node List Answer 5, List Answer 6, List Answer 4, Answers to Exercises
+@node List Answer 5
 @subsection List Tutorial Exercise 5
 
 @noindent
@@ -7222,14 +7222,14 @@ Incidentally, Calc provides the @dfn{Möbius μ}
 function which is zero if and only if its argument is square-free.  It
 would be a much more convenient way to do the above test in practice.
 
-@node List Answer 6, List Answer 7, List Answer 5, Answers to Exercises
+@node List Answer 6
 @subsection List Tutorial Exercise 6
 
 @noindent
 First use @kbd{v x 6 @key{RET}} to get a list of integers, then @kbd{V M v x}
 to get a list of lists of integers!
 
-@node List Answer 7, List Answer 8, List Answer 6, Answers to Exercises
+@node List Answer 7
 @subsection List Tutorial Exercise 7
 
 @noindent
@@ -7302,7 +7302,7 @@ triangular list.
 since each element of the main vector is itself a small vector,
 @kbd{V R +} computes the sum of its elements.)
 
-@node List Answer 8, List Answer 9, List Answer 7, Answers to Exercises
+@node List Answer 8
 @subsection List Tutorial Exercise 8
 
 @noindent
@@ -7391,7 +7391,7 @@ The output from @kbd{a X} is a vector containing the 
value of @expr{x}
 that maximizes the function, and the function's value at that maximum.
 As you can see, our simple search got quite close to the right answer.
 
-@node List Answer 9, List Answer 10, List Answer 8, Answers to Exercises
+@node List Answer 9
 @subsection List Tutorial Exercise 9
 
 @noindent
@@ -7513,7 +7513,7 @@ Another way to do this final step would be to reduce the 
formula
 @end group
 @end smallexample
 
-@node List Answer 10, List Answer 11, List Answer 9, Answers to Exercises
+@node List Answer 10
 @subsection List Tutorial Exercise 10
 
 @noindent
@@ -7544,7 +7544,7 @@ Here's a more correct method:
 @end group
 @end smallexample
 
-@node List Answer 11, List Answer 12, List Answer 10, Answers to Exercises
+@node List Answer 11
 @subsection List Tutorial Exercise 11
 
 @noindent
@@ -7611,7 +7611,7 @@ will be slightly different from the one shown here!)
 If you typed @kbd{v .} and @kbd{t .} before, type them again to
 return to full-sized display of vectors.
 
-@node List Answer 12, List Answer 13, List Answer 11, Answers to Exercises
+@node List Answer 12
 @subsection List Tutorial Exercise 12
 
 @noindent
@@ -7722,7 +7722,7 @@ exercise 10, of Knuth's @emph{Art of Computer 
Programming}, volume II.
 If you typed @kbd{v .} and @kbd{t .} before, type them again to
 return to full-sized display of vectors.
 
-@node List Answer 13, List Answer 14, List Answer 12, Answers to Exercises
+@node List Answer 13
 @subsection List Tutorial Exercise 13
 
 @noindent
@@ -7862,7 +7862,7 @@ Later in the tutorial we will encounter @dfn{modulo 
forms}, which
 basically automate the idea of reducing every intermediate result
 modulo some value @var{m}.
 
-@node List Answer 14, Types Answer 1, List Answer 13, Answers to Exercises
+@node List Answer 14
 @subsection List Tutorial Exercise 14
 
 We want to use @kbd{H V U} to nest a function which adds a random
@@ -7927,7 +7927,7 @@ and in the second we could use polar complex numbers with 
random phase
 angles.  (This exercise was first suggested in this form by Randal
 Schwartz.)
 
-@node Types Answer 1, Types Answer 2, List Answer 14, Answers to Exercises
+@node Types Answer 1
 @subsection Types Tutorial Exercise 1
 
 @noindent
@@ -7971,7 +7971,7 @@ Notice that we didn't need to re-round the number when we 
reduced the
 precision.  Remember, arithmetic operations always round their inputs
 to the current precision before they begin.
 
-@node Types Answer 2, Types Answer 3, Types Answer 1, Answers to Exercises
+@node Types Answer 2
 @subsection Types Tutorial Exercise 2
 
 @noindent
@@ -8007,7 +8007,7 @@ input.  As in the @expr{1 / 0} case, Calc will only use 
infinities
 here if you have turned on Infinite mode.  Otherwise, it will
 treat @samp{ln(0)} as an error.
 
-@node Types Answer 3, Types Answer 4, Types Answer 2, Answers to Exercises
+@node Types Answer 3
 @subsection Types Tutorial Exercise 3
 
 @noindent
@@ -8029,7 +8029,7 @@ for infinities (only the direction counts, not the 
``size''); but
 Calc is careful to write @code{nan} any time this simple model is
 unable to tell what the true answer is.
 
-@node Types Answer 4, Types Answer 5, Types Answer 3, Answers to Exercises
+@node Types Answer 4
 @subsection Types Tutorial Exercise 4
 
 @smallexample
@@ -8058,7 +8058,7 @@ The average song length is two minutes and 47.4 seconds.
 @noindent
 The album would be 53 minutes and 6 seconds long.
 
-@node Types Answer 5, Types Answer 6, Types Answer 4, Answers to Exercises
+@node Types Answer 5
 @subsection Types Tutorial Exercise 5
 
 @noindent
@@ -8110,7 +8110,7 @@ Et voilà, September 13, 1991 is a Friday.
 @noindent
 And the answer to our original question:  242 days to go.
 
-@node Types Answer 6, Types Answer 7, Types Answer 5, Answers to Exercises
+@node Types Answer 6
 @subsection Types Tutorial Exercise 6
 
 @noindent
@@ -8156,7 +8156,7 @@ of course, that the algorithm for computing leap years 
remains
 unchanged for that long.  @xref{Date Forms}, for some interesting
 background information in that regard.)
 
-@node Types Answer 7, Types Answer 8, Types Answer 6, Answers to Exercises
+@node Types Answer 7
 @subsection Types Tutorial Exercise 7
 
 @noindent
@@ -8201,7 +8201,7 @@ well as a vector.  This saves us some retyping of numbers.
 @noindent
 Thus the volume is 6316 cubic centimeters, within about 11 percent.
 
-@node Types Answer 8, Types Answer 9, Types Answer 7, Answers to Exercises
+@node Types Answer 8
 @subsection Types Tutorial Exercise 8
 
 @noindent
@@ -8233,7 +8233,7 @@ It may be disappointing to hear ``the answer lies 
somewhere between
 minus infinity and plus infinity, inclusive,'' but that's the best
 that interval arithmetic can do in this case.
 
-@node Types Answer 9, Types Answer 10, Types Answer 8, Answers to Exercises
+@node Types Answer 9
 @subsection Types Tutorial Exercise 9
 
 @smallexample
@@ -8257,7 +8257,7 @@ for different numbers.
 
 The same issue arises when you try to square an error form.
 
-@node Types Answer 10, Types Answer 11, Types Answer 9, Answers to Exercises
+@node Types Answer 10
 @subsection Types Tutorial Exercise 10
 
 @noindent
@@ -8305,7 +8305,7 @@ numbers it does an exact test; for large numbers it uses 
a variant
 of the Fermat test we used here.  You can use @kbd{k p} repeatedly
 to prove that a large integer is prime with any desired probability.
 
-@node Types Answer 11, Types Answer 12, Types Answer 10, Answers to Exercises
+@node Types Answer 11
 @subsection Types Tutorial Exercise 11
 
 @noindent
@@ -8353,7 +8353,7 @@ HMS form:
 The @kbd{=} key is necessary to evaluate the symbol @samp{pi} to
 the actual number 3.14159...
 
-@node Types Answer 12, Types Answer 13, Types Answer 11, Answers to Exercises
+@node Types Answer 12
 @subsection Types Tutorial Exercise 12
 
 @noindent
@@ -8383,13 +8383,13 @@ each.
 @noindent
 No matter how long it is, the album will fit nicely on one CD.
 
-@node Types Answer 13, Types Answer 14, Types Answer 12, Answers to Exercises
+@node Types Answer 13
 @subsection Types Tutorial Exercise 13
 
 @noindent
 Type @kbd{' 1 yr @key{RET} u c s @key{RET}}.  The answer is 31557600 seconds.
 
-@node Types Answer 14, Types Answer 15, Types Answer 13, Answers to Exercises
+@node Types Answer 14
 @subsection Types Tutorial Exercise 14
 
 @noindent
@@ -8423,7 +8423,7 @@ Thus a signal could take up to 81 percent of a clock 
cycle just to
 go from one place to another inside the computer, assuming the signal
 could actually attain the full speed of light.  Pretty tight!
 
-@node Types Answer 15, Algebra Answer 1, Types Answer 14, Answers to Exercises
+@node Types Answer 15
 @subsection Types Tutorial Exercise 15
 
 @noindent
@@ -8457,7 +8457,7 @@ answer, assuming that each successive pill doubles his 
speed.
 @noindent
 Thus Sam can take up to 14 pills without a worry.
 
-@node Algebra Answer 1, Algebra Answer 2, Types Answer 15, Answers to Exercises
+@node Algebra Answer 1
 @subsection Algebra Tutorial Exercise 1
 
 @noindent
@@ -8469,7 +8469,7 @@ simplified to @samp{abs(x)}, but for general complex 
arguments even
 that is not safe.  (@xref{Declarations}, for a way to tell Calc
 that @expr{x} is known to be real.)
 
-@node Algebra Answer 2, Algebra Answer 3, Algebra Answer 1, Answers to 
Exercises
+@node Algebra Answer 2
 @subsection Algebra Tutorial Exercise 2
 
 @noindent
@@ -8512,7 +8512,7 @@ familiar form.
 Sure enough, our answer (multiplied by a suitable constant) is the
 same as the original polynomial.
 
-@node Algebra Answer 3, Algebra Answer 4, Algebra Answer 2, Answers to 
Exercises
+@node Algebra Answer 3
 @subsection Algebra Tutorial Exercise 3
 
 @smallexample
@@ -8575,7 +8575,7 @@ same as the original polynomial.
 @end group
 @end smallexample
 
-@node Algebra Answer 4, Rewrites Answer 1, Algebra Answer 3, Answers to 
Exercises
+@node Algebra Answer 4
 @subsection Algebra Tutorial Exercise 4
 
 @noindent
@@ -8645,7 +8645,7 @@ same thing.
 @noindent
 Wow!  That's even better than the result from the Taylor series method.
 
-@node Rewrites Answer 1, Rewrites Answer 2, Algebra Answer 4, Answers to 
Exercises
+@node Rewrites Answer 1
 @subsection Rewrites Tutorial Exercise 1
 
 @noindent
@@ -8697,7 +8697,7 @@ The multiply-by-conjugate rule turns out to be useful in 
many
 different circumstances, such as when the denominator involves
 sines and cosines or the imaginary constant @code{i}.
 
-@node Rewrites Answer 2, Rewrites Answer 3, Rewrites Answer 1, Answers to 
Exercises
+@node Rewrites Answer 2
 @subsection Rewrites Tutorial Exercise 2
 
 @noindent
@@ -8733,7 +8733,7 @@ help keep this from happening by accident would be to use 
something like
 @samp{ZzFib} instead of @code{fib} as the name of the three-argument
 function.
 
-@node Rewrites Answer 3, Rewrites Answer 4, Rewrites Answer 2, Answers to 
Exercises
+@node Rewrites Answer 3
 @subsection Rewrites Tutorial Exercise 3
 
 @noindent
@@ -8755,7 +8755,7 @@ to it.  While this may seem odd, it's just as valid a 
solution as the
 on the lefthand side, so that the rule matches the actual variable
 @samp{x} rather than letting @samp{x} stand for something else.)
 
-@node Rewrites Answer 4, Rewrites Answer 5, Rewrites Answer 3, Answers to 
Exercises
+@node Rewrites Answer 4
 @subsection Rewrites Tutorial Exercise 4
 
 @noindent
@@ -8828,7 +8828,7 @@ will not get into an infinite loop.  Calc will not be 
able to prove
 the symbol @samp{x} is either even or odd, so none of the rules will
 apply and the rewrites will stop right away.
 
-@node Rewrites Answer 5, Rewrites Answer 6, Rewrites Answer 4, Answers to 
Exercises
+@node Rewrites Answer 5
 @subsection Rewrites Tutorial Exercise 5
 
 @noindent
@@ -8852,7 +8852,7 @@ Here we have taken advantage of the fact that earlier 
rules always
 match before later rules; @samp{nterms(x)} will only be tried if we
 already know that @samp{x} is not a sum.
 
-@node Rewrites Answer 6, Programming Answer 1, Rewrites Answer 5, Answers to 
Exercises
+@node Rewrites Answer 6
 @subsection Rewrites Tutorial Exercise 6
 
 @noindent
@@ -8927,7 +8927,7 @@ for a way to do this in Calc, although for something as 
involved as
 this it would probably be better to write the formatting routine
 in Lisp.)
 
-@node Programming Answer 1, Programming Answer 2, Rewrites Answer 6, Answers 
to Exercises
+@node Programming Answer 1
 @subsection Programming Tutorial Exercise 1
 
 @noindent
@@ -8940,7 +8940,7 @@ to be used within @code{ninteg}.
 The exact keystrokes are @kbd{Z F s Si @key{RET} @key{RET} C-b C-b @key{DEL} 
@key{DEL} @key{RET} y}.
 (The @kbd{C-b C-b @key{DEL} @key{DEL}} are what fix the argument list.)
 
-@node Programming Answer 2, Programming Answer 3, Programming Answer 1, 
Answers to Exercises
+@node Programming Answer 2
 @subsection Programming Tutorial Exercise 2
 
 @noindent
@@ -8957,7 +8957,7 @@ which is just what we want:  @kbd{C-x ( M-- 3 n C-x )}.
 Just for kicks, let's also do it algebraically:
 @w{@kbd{C-x ( ' -$$$, $$, $ @key{RET} C-x )}}.
 
-@node Programming Answer 3, Programming Answer 4, Programming Answer 2, 
Answers to Exercises
+@node Programming Answer 3
 @subsection Programming Tutorial Exercise 3
 
 @noindent
@@ -8993,13 +8993,13 @@ next command.)
 
 Using algebraic entry:  @kbd{C-x (  ' index($) @key{RET}  C-x )}.
 
-@node Programming Answer 4, Programming Answer 5, Programming Answer 3, 
Answers to Exercises
+@node Programming Answer 4
 @subsection Programming Tutorial Exercise 4
 
 @noindent
 Here's one way:  @kbd{C-x ( @key{RET} V R + @key{TAB} v l / C-x )}.
 
-@node Programming Answer 5, Programming Answer 6, Programming Answer 4, 
Answers to Exercises
+@node Programming Answer 5
 @subsection Programming Tutorial Exercise 5
 
 @smallexample
@@ -9015,7 +9015,7 @@ Here's one way:  @kbd{C-x ( @key{RET} V R + @key{TAB} v l 
/ C-x )}.
 @noindent
 This answer is quite accurate.
 
-@node Programming Answer 6, Programming Answer 7, Programming Answer 5, 
Answers to Exercises
+@node Programming Answer 6
 @subsection Programming Tutorial Exercise 6
 
 @noindent
@@ -9044,7 +9044,7 @@ number (a 209-digit integer!)@: in about 10 steps; even 
though the
 @kbd{Z < ... Z >} solution had much simpler steps, it would have
 required so many steps that it would not have been practical.
 
-@node Programming Answer 7, Programming Answer 8, Programming Answer 6, 
Answers to Exercises
+@node Programming Answer 7
 @subsection Programming Tutorial Exercise 7
 
 @noindent
@@ -9085,7 +9085,7 @@ loop counter exceeds 4.
 Thus we find that the 30th harmonic number is 3.99, and the 31st
 harmonic number is 4.02.
 
-@node Programming Answer 8, Programming Answer 9, Programming Answer 7, 
Answers to Exercises
+@node Programming Answer 8
 @subsection Programming Tutorial Exercise 8
 
 @noindent
@@ -9201,7 +9201,7 @@ Also, of course, @kbd{a R} is a built-in command that 
uses Newton's
 method (among others) to look for numerical solutions to any equation.
 @xref{Root Finding}.
 
-@node Programming Answer 9, Programming Answer 10, Programming Answer 8, 
Answers to Exercises
+@node Programming Answer 9
 @subsection Programming Tutorial Exercise 9
 
 @noindent
@@ -9324,7 +9324,7 @@ C-x )
 @end group
 @end example
 
-@node Programming Answer 10, Programming Answer 11, Programming Answer 9, 
Answers to Exercises
+@node Programming Answer 10
 @subsection Programming Tutorial Exercise 10
 
 @noindent
@@ -9422,7 +9422,7 @@ C-x (  1 + 0 @key{RET} 1 C-u v x ' x @key{RET} @key{TAB} 
V M ^ *  C-x )
 @end group
 @end example
 
-@node Programming Answer 11, Programming Answer 12, Programming Answer 10, 
Answers to Exercises
+@node Programming Answer 11
 @subsection Programming Tutorial Exercise 11
 
 @noindent
@@ -9527,7 +9527,7 @@ first, because @code{read-kbd-macro} doesn't need to 
execute the
 definition as it reads it in.  For this reason, @code{C-x * m} is often
 the easiest way to create recursive programs in Calc.
 
-@node Programming Answer 12,  , Programming Answer 11, Answers to Exercises
+@node Programming Answer 12
 @subsection Programming Tutorial Exercise 12
 
 @noindent
@@ -9568,7 +9568,7 @@ the last rule.
 
 @c [reference]
 
-@node Introduction, Data Types, Tutorial, Top
+@node Introduction
 @chapter Introduction
 
 @noindent
@@ -9593,7 +9593,7 @@ numeric entry, undo, numeric prefix arguments, etc.
 * Troubleshooting Commands::
 @end menu
 
-@node Basic Commands, Help Commands, Introduction, Introduction
+@node Basic Commands
 @section Basic Commands
 
 @noindent
@@ -9762,7 +9762,7 @@ the stack but resets everything else to its initial 
state; with a
 negative prefix argument, @kbd{C-x * 0} preserves the contents of the
 stack but resets everything else to its default state.
 
-@node Help Commands, Stack Basics, Basic Commands, Introduction
+@node Help Commands
 @section Help Commands
 
 @noindent
@@ -9907,7 +9907,7 @@ distribution, and warranty information about Calc.  These 
work by
 pulling up the appropriate parts of the ``Copying'' or ``Reporting
 Bugs'' sections of the manual.
 
-@node Stack Basics, Numeric Entry, Help Commands, Introduction
+@node Stack Basics
 @section Stack Basics
 
 @noindent
@@ -9959,7 +9959,7 @@ The @key{TAB} key swaps the top two objects on the stack.
 @xref{Stack and Trail}, for descriptions of these and other stack-related
 commands.
 
-@node Numeric Entry, Algebraic Entry, Stack Basics, Introduction
+@node Numeric Entry
 @section Numeric Entry
 
 @noindent
@@ -9996,7 +9996,7 @@ data types.  @xref{Data Types}.
 
 During numeric entry, the only editing key available is @key{DEL}.
 
-@node Algebraic Entry, Quick Calculator, Numeric Entry, Introduction
+@node Algebraic Entry
 @section Algebraic Entry
 
 @noindent
@@ -10114,7 +10114,7 @@ is being pushed on the stack.  Thus @kbd{' 1+2 
@key{RET}} pushes 3
 on the stack, but @kbd{' 1+2 @key{LFD}} pushes the formula @expr{1+2};
 you might then press @kbd{=} when it is time to evaluate this formula.
 
-@node Quick Calculator, Prefix Arguments, Algebraic Entry, Introduction
+@node Quick Calculator
 @section ``Quick Calculator'' Mode
 
 @noindent
@@ -10183,7 +10183,7 @@ or computing the answer than the full Calculator; the 
name ``quick''
 merely refers to the fact that it's much less hassle to use for
 small calculations.
 
-@node Prefix Arguments, Undo, Quick Calculator, Introduction
+@node Prefix Arguments
 @section Numeric Prefix Arguments
 
 @noindent
@@ -10231,7 +10231,7 @@ to the fourth power and set the precision to that value.
 Conversely, if you have typed a numeric prefix argument the @kbd{~} key
 pushes it onto the stack in the form of an integer.
 
-@node Undo, Error Messages, Prefix Arguments, Introduction
+@node Undo
 @section Undoing Mistakes
 
 @noindent
@@ -10289,7 +10289,7 @@ It is also possible to recall previous results or 
inputs using the trail.
 
 The standard Emacs @kbd{C-_} undo key is recognized as a synonym for @kbd{U}.
 
-@node Error Messages, Multiple Calculators, Undo, Introduction
+@node Error Messages
 @section Error Messages
 
 @noindent
@@ -10320,7 +10320,7 @@ after your computation finishes.)  By default, this 
occurs only for
 @emph{all} messages automatically, or to report none automatically (so
 that you must always press @kbd{w} yourself to see the messages).
 
-@node Multiple Calculators, Troubleshooting Commands, Error Messages, 
Introduction
+@node Multiple Calculators
 @section Multiple Calculators
 
 @noindent
@@ -10347,7 +10347,7 @@ the stack and mode settings of the buffer being quit as 
the new defaults.
 There is only one trail buffer, @file{*Calc Trail*}, used by all
 Calculator buffers.
 
-@node Troubleshooting Commands,  , Multiple Calculators, Introduction
+@node Troubleshooting Commands
 @section Troubleshooting Commands
 
 @noindent
@@ -10364,7 +10364,7 @@ to a bug or deficiency in Calc.
 * Debugging Calc::
 @end menu
 
-@node Autoloading Problems, Recursion Depth, Troubleshooting Commands, 
Troubleshooting Commands
+@node Autoloading Problems
 @subsection Autoloading Problems
 
 @noindent
@@ -10381,7 +10381,7 @@ If this happens, the easiest workaround is to type 
@kbd{C-x * L}
 loaded right away.  This will cause Emacs to take up a lot more
 memory than it would otherwise, but it's guaranteed to fix the problem.
 
-@node Recursion Depth, Caches, Autoloading Problems, Troubleshooting Commands
+@node Recursion Depth
 @subsection Recursion Depth
 
 @noindent
@@ -10409,7 +10409,7 @@ The default value is 1000.
 These commands also double or halve @code{max-specpdl-size}, another
 internal Lisp recursion limit.  The minimum value for this limit is 600.
 
-@node Caches, Debugging Calc, Recursion Depth, Troubleshooting Commands
+@node Caches
 @subsection Caches
 
 @noindent
@@ -10438,7 +10438,7 @@ If you suspect a Calculator cache has become corrupt, 
you can use the
 The @kbd{C-x * 0} (with the zero key) command also resets caches along
 with all other aspects of the Calculator's state.
 
-@node Debugging Calc,  , Caches, Troubleshooting Commands
+@node Debugging Calc
 @subsection Debugging Calc
 
 @noindent
@@ -10491,7 +10491,7 @@ error.  After you have executed 
@code{calc-pass-errors}, Lisp
 errors will be reported correctly but the user-friendly message
 will be lost.
 
-@node Data Types, Stack and Trail, Introduction, Top
+@node Data Types
 @chapter Data Types
 
 @noindent
@@ -10526,7 +10526,7 @@ matrices, or algebraic formulas.
 * Formulas::
 @end menu
 
-@node Integers, Fractions, Data Types, Data Types
+@node Integers
 @section Integers
 
 @noindent
@@ -10552,7 +10552,7 @@ to set the default radix for display of integers.  
Numbers of any radix
 may be entered at any time.  If you press @kbd{#} at the beginning of a
 number, the current display radix is used.
 
-@node Fractions, Floats, Integers, Data Types
+@node Fractions
 @section Fractions
 
 @noindent
@@ -10573,7 +10573,7 @@ Non-decimal fractions are entered and displayed as
 @samp{@var{radix}#@var{num}:@var{denom}} (or in the analogous three-part
 form).  The numerator and denominator always use the same radix.
 
-@node Floats, Complex Numbers, Fractions, Data Types
+@node Floats
 @section Floats
 
 @noindent
@@ -10647,7 +10647,7 @@ the letter @samp{e} is a digit, so scientific notation 
must be written
 out, e.g., @samp{16#123.4567*16^2}.  The first two exercises of the
 Modes Tutorial explore some of the properties of non-decimal floats.
 
-@node Complex Numbers, Infinities, Floats, Data Types
+@node Complex Numbers
 @section Complex Numbers
 
 @noindent
@@ -10685,7 +10685,7 @@ A complex result in which the imaginary part is zero 
(or the phase angle
 is 0 or 180 degrees or @cpi{} radians) is automatically converted to a real
 number.
 
-@node Infinities, Vectors and Matrices, Complex Numbers, Data Types
+@node Infinities
 @section Infinities
 
 @noindent
@@ -10772,7 +10772,7 @@ expressions are @samp{inf - inf} and @samp{inf ^ 0}.  
Also,
 Infinities are especially useful as parts of @dfn{intervals}.
 @xref{Interval Forms}.
 
-@node Vectors and Matrices, Strings, Infinities, Data Types
+@node Vectors and Matrices
 @section Vectors and Matrices
 
 @noindent
@@ -10814,7 +10814,7 @@ to build @samp{[a, b, c]}, @samp{cvec(a, n, m)} to 
build an
 matrix of @samp{a}s, and @samp{index(n)} to build a vector of integers
 from 1 to @samp{n}.
 
-@node Strings, HMS Forms, Vectors and Matrices, Data Types
+@node Strings
 @section Strings
 
 @noindent
@@ -10891,7 +10891,7 @@ the resulting string is breakable across multiple lines 
if it doesn't
 fit all on one line.  Potential break points occur at every space
 character in the string.
 
-@node HMS Forms, Date Forms, Strings, Data Types
+@node HMS Forms
 @section HMS Forms
 
 @noindent
@@ -10953,7 +10953,7 @@ two HMS forms produces a real-valued ratio of the two 
angles.
 Just for kicks, @kbd{M-x calc-time} pushes the current time of day on
 the stack as an HMS form.
 
-@node Date Forms, Modulo Forms, HMS Forms, Data Types
+@node Date Forms
 @section Date Forms
 
 @noindent
@@ -11109,7 +11109,7 @@ for California time.  The same is usually true of 
Julian day
 counts.)  The built-in @kbd{t U} command performs these
 conversions.
 
-@node Modulo Forms, Error Forms, Date Forms, Data Types
+@node Modulo Forms
 @section Modulo Forms
 
 @noindent
@@ -11193,7 +11193,7 @@ You can use @kbd{v p} and @kbd{%} to modify modulo 
forms.
 The algebraic function @samp{makemod(a, m)} builds the modulo form
 @w{@samp{a mod m}}.
 
-@node Error Forms, Interval Forms, Modulo Forms, Data Types
+@node Error Forms
 @section Error Forms
 
 @noindent
@@ -11308,7 +11308,7 @@ the mean and the error should be HMS forms if either 
one is.
 @tindex sdev
 The algebraic function @samp{sdev(a, b)} builds the error form @samp{a +/- b}.
 
-@node Interval Forms, Incomplete Objects, Error Forms, Data Types
+@node Interval Forms
 @section Interval Forms
 
 @noindent
@@ -11423,7 +11423,7 @@ should yield the interval @samp{[1..2]} again, but in 
fact it yields the
 (slightly too small) interval @samp{[1..1.9999999]} due to roundoff
 error.
 
-@node Incomplete Objects, Variables, Interval Forms, Data Types
+@node Incomplete Objects
 @section Incomplete Objects
 
 @noindent
@@ -11486,7 +11486,7 @@ the @code{calc-dots} command.
 If you find incomplete entry distracting, you may wish to enter vectors
 and complex numbers as algebraic formulas by pressing the apostrophe key.
 
-@node Variables, Formulas, Incomplete Objects, Data Types
+@node Variables
 @section Variables
 
 @noindent
@@ -11557,7 +11557,7 @@ a value into any of these special variables.
 
 @xref{Store and Recall}, for a discussion of commands dealing with variables.
 
-@node Formulas,  , Variables, Data Types
+@node Formulas
 @section Formulas
 
 @noindent
@@ -11715,7 +11715,7 @@ formats.
 
 @xref{Algebra}, for commands for manipulating formulas symbolically.
 
-@node Stack and Trail, Mode Settings, Data Types, Top
+@node Stack and Trail
 @chapter Stack and Trail Commands
 
 @noindent
@@ -11730,7 +11730,7 @@ type, such as numbers, vectors, formulas, and 
incomplete objects.)
 * Keep Arguments::
 @end menu
 
-@node Stack Manipulation, Editing Stack Entries, Stack and Trail, Stack and 
Trail
+@node Stack Manipulation
 @section Stack Manipulation Commands
 
 @noindent
@@ -11859,7 +11859,7 @@ the line containing @samp{30}, @kbd{C-u 2 C-x C-t} 
creates
 @samp{10 40 20 30 50}. With an argument of 0, @kbd{C-x C-t} will switch
 the stack objects at the levels determined by the point and the mark.
 
-@node Editing Stack Entries, Trail Commands, Stack Manipulation, Stack and 
Trail
+@node Editing Stack Entries
 @section Editing Stack Entries
 
 @noindent
@@ -11913,7 +11913,7 @@ The @kbd{`} key also works during numeric or algebraic 
entry.  The
 text entered so far is moved to the @file{*Calc Edit*} buffer for
 more extensive editing than is convenient in the minibuffer.
 
-@node Trail Commands, Keep Arguments, Editing Stack Entries, Stack and Trail
+@node Trail Commands
 @section Trail Commands
 
 @noindent
@@ -12034,7 +12034,7 @@ kills the @var{n} lines below or above the selected one.
 The @kbd{t .} (@code{calc-full-trail-vectors}) command is described
 elsewhere; @pxref{Vector and Matrix Formats}.
 
-@node Keep Arguments,  , Trail Commands, Stack and Trail
+@node Keep Arguments
 @section Keep Arguments
 
 @noindent
@@ -12077,7 +12077,7 @@ onto the stack.  Note that the order of things on the 
stack will be
 different than with @kbd{K}:  @kbd{2 @key{RET} 3 + M-@key{RET}} leaves
 @samp{5 2 3} on the stack instead of @samp{2 3 5}.  @xref{Undo}.
 
-@node Mode Settings, Arithmetic, Stack and Trail, Top
+@node Mode Settings
 @chapter Mode Settings
 
 @noindent
@@ -12098,7 +12098,7 @@ the @emph{appearance} or @emph{interpretation} of the 
stack's contents.
 * Calc Mode Line::
 @end menu
 
-@node General Mode Commands, Precision, Mode Settings, Mode Settings
+@node General Mode Commands
 @section General Mode Commands
 
 @noindent
@@ -12180,7 +12180,7 @@ the @kbd{z} and @kbd{Z} prefix keys are always 
distinct.  Also, the @kbd{h}
 prefix is not affected by this mode.  Press @kbd{m S} again to disable
 shifted-prefix mode.
 
-@node Precision, Inverse and Hyperbolic, General Mode Commands, Mode Settings
+@node Precision
 @section Precision
 
 @noindent
@@ -12237,7 +12237,7 @@ would round this to 150 cents, i.e., $1.50.
 @xref{Floats}, for still more on floating-point precision and related
 issues.
 
-@node Inverse and Hyperbolic, Calculation Modes, Precision, Mode Settings
+@node Inverse and Hyperbolic
 @section Inverse and Hyperbolic Flags
 
 @noindent
@@ -12280,7 +12280,7 @@ to subtract and keep arguments).
 Another Calc prefix flag, @kbd{K} (keep-arguments), is discussed
 elsewhere.  @xref{Keep Arguments}.
 
-@node Calculation Modes, Simplification Modes, Inverse and Hyperbolic, Mode 
Settings
+@node Calculation Modes
 @section Calculation Modes
 
 @noindent
@@ -12300,7 +12300,7 @@ The @samp{m a} (@code{calc-algebraic-mode}) command is 
described elsewhere
 * Working Message::
 @end menu
 
-@node Angular Modes, Polar Mode, Calculation Modes, Calculation Modes
+@node Angular Modes
 @subsection Angular Modes
 
 @noindent
@@ -12331,7 +12331,7 @@ and @kbd{m h} (@code{calc-hms-mode}) commands control 
the angular mode.
 The current angular mode is displayed on the Emacs mode line.
 The default angular mode is Degrees.
 
-@node Polar Mode, Fraction Mode, Angular Modes, Calculation Modes
+@node Polar Mode
 @subsection Polar Mode
 
 @noindent
@@ -12348,7 +12348,7 @@ The @kbd{m p} (@code{calc-polar-mode}) command toggles 
complex-number
 preference between rectangular and polar forms.  In Polar mode, all
 of the above example situations would produce polar complex numbers.
 
-@node Fraction Mode, Infinite Mode, Polar Mode, Calculation Modes
+@node Fraction Mode
 @subsection Fraction Mode
 
 @noindent
@@ -12374,7 +12374,7 @@ At any time you can use @kbd{c f} (@code{calc-float}) 
to convert a
 fraction to a float, or @kbd{c F} (@code{calc-fraction}) to convert a
 float to a fraction.  @xref{Conversions}.
 
-@node Infinite Mode, Symbolic Mode, Fraction Mode, Calculation Modes
+@node Infinite Mode
 @subsection Infinite Mode
 
 @noindent
@@ -12414,7 +12414,7 @@ single symbol, @samp{0}.  One consequence of this is 
that, while
 you might expect @samp{1 / -0 = -inf}, actually @samp{1 / -0}
 is equivalent to @samp{1 / 0}, which is equal to positive @code{inf}.
 
-@node Symbolic Mode, Matrix Mode, Infinite Mode, Calculation Modes
+@node Symbolic Mode
 @subsection Symbolic Mode
 
 @noindent
@@ -12447,7 +12447,7 @@ contains, you can use the key sequence @kbd{m s a v m 
s} (this uses
 @code{calc-alg-evaluate}, which resimplifies but doesn't evaluate
 variables.)
 
-@node Matrix Mode, Automatic Recomputation, Symbolic Mode, Calculation Modes
+@node Matrix Mode
 @subsection Matrix and Scalar Modes
 
 @noindent
@@ -12519,7 +12519,7 @@ of the formula without affecting the rest just select 
that part,
 change into Scalar mode and press @kbd{=} to resimplify the part
 under this mode, then change back to Matrix mode before deselecting.
 
-@node Automatic Recomputation, Working Message, Matrix Mode, Calculation Modes
+@node Automatic Recomputation
 @subsection Automatic Recomputation
 
 @noindent
@@ -12543,7 +12543,7 @@ To update @samp{=>} operators in an Embedded buffer 
while
 automatic recomputation is off, use @w{@kbd{C-x * u}}.
 @xref{Embedded Mode}.
 
-@node Working Message,  , Automatic Recomputation, Calculation Modes
+@node Working Message
 @subsection Working Messages
 
 @noindent
@@ -12570,7 +12570,7 @@ considerably, experiments have shown that their impact 
is actually
 quite small.  But if your terminal is slow you may find that it helps
 to turn the messages off.
 
-@node Simplification Modes, Declarations, Calculation Modes, Mode Settings
+@node Simplification Modes
 @section Simplification Modes
 
 @noindent
@@ -12651,7 +12651,7 @@ A common technique is to set the simplification mode 
down to the lowest
 amount of simplification you will allow to be applied automatically, then
 use manual commands like @kbd{a s} and @kbd{c c} (@code{calc-clean}) to
 perform higher types of simplifications on demand.
-@node Declarations, Display Modes, Simplification Modes, Mode Settings
+@node Declarations
 @section Declarations
 
 @noindent
@@ -12666,7 +12666,7 @@ take the fully general situation into account.
 * Functions for Declarations::
 @end menu
 
-@node Declaration Basics, Kinds of Declarations, Declarations, Declarations
+@node Declaration Basics
 @subsection Declaration Basics
 
 @noindent
@@ -12731,7 +12731,7 @@ are explicitly declared without @code{real} in some 
other row.
 The @kbd{s d} command declares @code{All} if you give a blank
 response to the variable-name prompt.
 
-@node Kinds of Declarations, Functions for Declarations, Declaration Basics, 
Declarations
+@node Kinds of Declarations
 @subsection Kinds of Declarations
 
 @noindent
@@ -12921,7 +12921,7 @@ using a variable for a new purpose, it is best to use 
@kbd{s d}
 or @kbd{s D} to check to make sure you don't still have an old
 declaration for the variable that will conflict with its new meaning.
 
-@node Functions for Declarations,  , Kinds of Declarations, Declarations
+@node Functions for Declarations
 @subsection Functions for Declarations
 
 @noindent
@@ -13060,7 +13060,7 @@ provably scalar, and @samp{!dscalar(a)} is ``true'' 
only if @code{a}
 is provably non-scalar; both are ``false'' if there is insufficient
 information to tell.
 
-@node Display Modes, Language Modes, Declarations, Mode Settings
+@node Display Modes
 @section Display Modes
 
 @noindent
@@ -13105,7 +13105,7 @@ words, @kbd{I d s} is equivalent to @kbd{H d s d 
@key{RET} H d (@var{old mode})}
 * Labels::
 @end menu
 
-@node Radix Modes, Grouping Digits, Display Modes, Display Modes
+@node Radix Modes
 @subsection Radix Modes
 
 @noindent
@@ -13190,7 +13190,7 @@ to
 will be represented using Calc's usual notation (in the appropriate
 radix).
 
-@node Grouping Digits, Float Formats, Radix Modes, Display Modes
+@node Grouping Digits
 @subsection Grouping Digits
 
 @noindent
@@ -13228,7 +13228,7 @@ if re-read in textual form, say by the use of @kbd{C-x 
* y} and @kbd{C-x * g}.
 the @samp{\,} separator, which doesn't interfere with parsing because it
 is ignored by @TeX{} language mode.
 
-@node Float Formats, Complex Formats, Grouping Digits, Display Modes
+@node Float Formats
 @subsection Float Formats
 
 @noindent
@@ -13294,7 +13294,7 @@ may wish to change this to a comma.  Note that this is 
only a display
 style; on entry, periods must always be used to denote floating-point
 numbers, and commas to separate elements in a list.
 
-@node Complex Formats, Fraction Formats, Float Formats, Display Modes
+@node Complex Formats
 @subsection Complex Formats
 
 @noindent
@@ -13325,7 +13325,7 @@ to @samp{(2,3)}.  Other commands (like @code{calc-sin}) 
will @emph{not}
 interpret the formula @samp{2 + 3 * i} as a complex number.
 @xref{Variables}, under ``special constants.''
 
-@node Fraction Formats, HMS Formats, Complex Formats, Display Modes
+@node Fraction Formats
 @subsection Fraction Formats
 
 @noindent
@@ -13362,7 +13362,7 @@ The fraction format does not affect the way fractions 
or integers are
 stored, only the way they appear on the screen.  The fraction format
 never affects floats.
 
-@node HMS Formats, Date Formats, Fraction Formats, Display Modes
+@node HMS Formats
 @subsection HMS Formats
 
 @noindent
@@ -13389,7 +13389,7 @@ The @kbd{'} key is recognized as ``minutes'' only if 
@kbd{@@} (or @kbd{h} or
 @kbd{o}) has already been pressed; otherwise it means to switch to algebraic
 entry.
 
-@node Date Formats, Truncating the Stack, HMS Formats, Display Modes
+@node Date Formats
 @subsection Date Formats
 
 @noindent
@@ -13420,7 +13420,7 @@ functions, your date formats should avoid using the 
@samp{#} character.
 * Standard Date Formats::
 @end menu
 
-@node ISO 8601, Date Formatting Codes, Date Formats, Date Formats
+@node ISO 8601
 @subsubsection ISO 8601
 
 @noindent
@@ -13498,7 +13498,7 @@ and seconds can be omitted, and decimals can be added.  
If a date with a
 time is represented, they should be separated by a literal ``T'', so noon
 on December 13, 2012 can be represented as 2012-12-13T12:00.
 
-@node Date Formatting Codes, Free-Form Dates, ISO 8601, Date Formats
+@node Date Formatting Codes
 @subsubsection Date Formatting Codes
 
 @noindent
@@ -13689,7 +13689,7 @@ The ``j,'' ``J,'' and ``U'' formats do not make any 
time zone
 adjustment.  They effectively use @samp{julian(x,0)} and
 @samp{unixtime(x,0)} to make the conversion; @pxref{Date Arithmetic}.
 
-@node Free-Form Dates, Standard Date Formats, Date Formatting Codes, Date 
Formats
+@node Free-Form Dates
 @subsubsection Free-Form Dates
 
 @noindent
@@ -13755,7 +13755,7 @@ minus sign on the year value.
 If you always enter a four-digit year, and use a name instead
 of a number for the month, there is no danger of ambiguity.
 
-@node Standard Date Formats,  , Free-Form Dates, Date Formats
+@node Standard Date Formats
 @subsubsection Standard Date Formats
 
 @noindent
@@ -13798,7 +13798,7 @@ command (@pxref{Mode Settings}).
 @samp{IYYY-Iww-w<Thh:mm:ss>} (ISO 8601 week numbering format)
 @end table
 
-@node Truncating the Stack, Justification, Date Formats, Display Modes
+@node Truncating the Stack
 @subsection Truncating the Stack
 
 @noindent
@@ -13833,7 +13833,7 @@ The @kbd{d [} (@code{calc-truncate-up}) and @kbd{d ]}
 (@code{calc-truncate-down}) commands move the @samp{.} up or down one
 line at a time (or several lines with a prefix argument).
 
-@node Justification, Labels, Truncating the Stack, Display Modes
+@node Justification
 @subsection Justification
 
 @noindent
@@ -13894,7 +13894,7 @@ when positioning by explicit origins and widths.  In 
the latter
 case, the display is formatted as specified, and then uniformly
 shifted over four spaces to fit the line numbers.
 
-@node Labels,  , Justification, Display Modes
+@node Labels
 @subsection Labels
 
 @noindent
@@ -13925,7 +13925,7 @@ document (possibly using Embedded mode).  The equations 
would
 typically be centered, and the equation numbers would be on the
 left or right as you prefer.
 
-@node Language Modes, Modes Variable, Display Modes, Mode Settings
+@node Language Modes
 @section Language Modes
 
 @noindent
@@ -13978,7 +13978,7 @@ shifted letter key.
 * Syntax Tables::
 @end menu
 
-@node Normal Language Modes, C FORTRAN Pascal, Language Modes, Language Modes
+@node Normal Language Modes
 @subsection Normal Language Modes
 
 @noindent
@@ -14080,7 +14080,7 @@ all four modes, and unformatted notation works in any 
language mode
 (except that Mathematica mode expects square brackets instead of
 parentheses).
 
-@node C FORTRAN Pascal, TeX and LaTeX Language Modes, Normal Language Modes, 
Language Modes
+@node C FORTRAN Pascal
 @subsection C, FORTRAN, and Pascal Modes
 
 @noindent
@@ -14155,7 +14155,7 @@ modes will use upper-case letters exclusively for 
display, and will
 convert to lower-case on input.  With a negative prefix, these modes
 convert to lower-case for display and input.
 
-@node TeX and LaTeX Language Modes, Eqn Language Mode, C FORTRAN Pascal, 
Language Modes
+@node TeX and LaTeX Language Modes
 @subsection @TeX{} and @LaTeX{} Language Modes
 
 @noindent
@@ -14575,7 +14575,7 @@ $$ \pmatrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
 @sp 2
 @end iftex
 
-@node Eqn Language Mode, Yacas Language Mode, TeX and LaTeX Language Modes, 
Language Modes
+@node Eqn Language Mode
 @subsection Eqn Language Mode
 
 @noindent
@@ -14651,7 +14651,7 @@ The words @code{lcol} and @code{rcol} are recognized as 
synonyms
 for @code{ccol} during input, and are generated instead of @code{ccol}
 if the matrix justification mode so specifies.
 
-@node Yacas Language Mode, Maxima Language Mode, Eqn Language Mode, Language 
Modes
+@node Yacas Language Mode
 @subsection Yacas Language Mode
 
 @noindent
@@ -14681,7 +14681,7 @@ use square brackets.  If, for example, @samp{A} 
represents the list
 @samp{@{a,2,c,4@}}, then @samp{A[3]} would equal @samp{c}.
 
 
-@node Maxima Language Mode, Giac Language Mode, Yacas Language Mode, Language 
Modes
+@node Maxima Language Mode
 @subsection Maxima Language Mode
 
 @noindent
@@ -14706,7 +14706,7 @@ Maxima uses square brackets for lists and vectors, and 
matrices are
 written as calls to the function @code{matrix}, given the row vectors of
 the matrix as arguments.  Square brackets are also used as subscripts.
 
-@node Giac Language Mode, Mathematica Language Mode, Maxima Language Mode, 
Language Modes
+@node Giac Language Mode
 @subsection Giac Language Mode
 
 @noindent
@@ -14731,7 +14731,7 @@ Calc reads @samp{2 .. 3} as the closed interval 
@samp{[2 .. 3]} and
 writes any kind of interval as @samp{2 .. 3}.  This means you cannot see
 the difference between an open and a closed interval while in Giac mode.
 
-@node Mathematica Language Mode, Maple Language Mode, Giac Language Mode, 
Language Modes
+@node Mathematica Language Mode
 @subsection Mathematica Language Mode
 
 @noindent
@@ -14754,7 +14754,7 @@ Non-decimal numbers are written, e.g., @samp{16^^7fff}. 
 Floating-point
 numbers in scientific notation are written @samp{1.23*10.^3}.
 Subscripts use double square brackets: @samp{a[[i]]}.
 
-@node Maple Language Mode, Compositions, Mathematica Language Mode, Language 
Modes
+@node Maple Language Mode
 @subsection Maple Language Mode
 
 @noindent
@@ -14788,7 +14788,7 @@ Among things not currently handled by Calc's Maple mode 
are the
 various quote symbols, procedures and functional operators, and
 inert (@samp{&}) operators.
 
-@node Compositions, Syntax Tables, Maple Language Mode, Language Modes
+@node Compositions
 @subsection Compositions
 
 @noindent
@@ -14824,7 +14824,7 @@ the language modes.
 * User-Defined Compositions::
 @end menu
 
-@node Composition Basics, Horizontal Compositions, Compositions, Compositions
+@node Composition Basics
 @subsubsection Composition Basics
 
 @noindent
@@ -14965,7 +14965,7 @@ in a function call), then the break points in that 
@code{bstring}
 will be on the same level as the break points of the surrounding
 object.
 
-@node Horizontal Compositions, Vertical Compositions, Composition Basics, 
Compositions
+@node Horizontal Compositions
 @subsubsection Horizontal Compositions
 
 @noindent
@@ -15009,7 +15009,7 @@ formats as @samp{2 (a + b c + (d = e))}.
 The baseline of a horizontal composition is the same as the
 baselines of the component compositions, which are all aligned.
 
-@node Vertical Compositions, Other Compositions, Horizontal Compositions, 
Compositions
+@node Vertical Compositions
 @subsubsection Vertical Compositions
 
 @noindent
@@ -15130,7 +15130,7 @@ Like @code{choriz}, the vertical compositions accept a 
second argument
 which gives the precedence to use when formatting the components.
 Vertical compositions do not support separator strings.
 
-@node Other Compositions, Information about Compositions, Vertical 
Compositions, Compositions
+@node Other Compositions
 @subsubsection Other Compositions
 
 @noindent
@@ -15224,7 +15224,7 @@ b   -
 @end group
 @end example
 
-@node Information about Compositions, User-Defined Compositions, Other 
Compositions, Compositions
+@node Information about Compositions
 @subsubsection Information about Compositions
 
 @noindent
@@ -15266,7 +15266,7 @@ For @samp{a / b} in Big mode, @code{cascent} returns 2 
and @code{cdescent}
 returns 1.  The only formula for which @code{cascent} will return zero
 is @samp{cvspace(0)} or equivalents.
 
-@node User-Defined Compositions,  , Information about Compositions, 
Compositions
+@node User-Defined Compositions
 @subsubsection User-Defined Compositions
 
 @noindent
@@ -15397,7 +15397,7 @@ produce a large, unwieldy integer.
 You can save your display formats permanently using the @kbd{Z P}
 command (@pxref{Creating User Keys}).
 
-@node Syntax Tables,  , Compositions, Language Modes
+@node Syntax Tables
 @subsection Syntax Tables
 
 @noindent
@@ -15427,7 +15427,7 @@ the syntax tables along with the other mode settings;
 * Conditional Syntax Rules::
 @end menu
 
-@node Syntax Table Basics, Precedence in Syntax Tables, Syntax Tables, Syntax 
Tables
+@node Syntax Table Basics
 @subsubsection Syntax Table Basics
 
 @noindent
@@ -15575,7 +15575,7 @@ respectively).
 Finally, the notation @samp{%%} anywhere in a syntax table causes
 the rest of the line to be ignored as a comment.
 
-@node Precedence in Syntax Tables, Advanced Syntax Patterns, Syntax Table 
Basics, Syntax Tables
+@node Precedence in Syntax Tables
 @subsubsection Precedence
 
 @noindent
@@ -15610,7 +15610,7 @@ can create a right-associative operator.
 standard Calc operators.  For the precedences of operators in other
 language modes, look in the Calc source file @file{calc-lang.el}.
 
-@node Advanced Syntax Patterns, Conditional Syntax Rules, Precedence in Syntax 
Tables, Syntax Tables
+@node Advanced Syntax Patterns
 @subsubsection Advanced Syntax Patterns
 
 @noindent
@@ -15730,7 +15730,7 @@ backs up and tries the other alternative.  Thus Calc 
has ``partial''
 backtracking.  A fully backtracking parser would go on to make sure
 the rest of the pattern matched before finalizing the choice.
 
-@node Conditional Syntax Rules,  , Advanced Syntax Patterns, Syntax Tables
+@node Conditional Syntax Rules
 @subsubsection Conditional Syntax Rules
 
 @noindent
@@ -15804,7 +15804,7 @@ Normal language mode for editing expressions in syntax 
rules, so we
 must use regular Calc notation for the interval @samp{[b..c]} that
 will correspond to the Maple mode interval @samp{1..10}.
 
-@node Modes Variable, Calc Mode Line, Language Modes, Mode Settings
+@node Modes Variable
 @section The @code{Modes} Variable
 
 @noindent
@@ -15906,7 +15906,7 @@ would not work for fixed-point mode, but it wouldn't be 
hard to
 do a full emulation with the help of the @kbd{Z [} and @kbd{Z ]}
 programming commands.  @xref{Conditionals in Macros}.)
 
-@node Calc Mode Line,  , Modes Variable, Mode Settings
+@node Calc Mode Line
 @section The Calc Mode Line
 
 @noindent
@@ -16125,7 +16125,7 @@ Stack is truncated (@kbd{d t}; @pxref{Truncating the 
Stack}).
 In addition, the symbols @code{Active} and @code{~Active} can appear
 as minor modes on an Embedded buffer's mode line.  @xref{Embedded Mode}.
 
-@node Arithmetic, Scientific Functions, Mode Settings, Top
+@node Arithmetic
 @chapter Arithmetic Functions
 
 @noindent
@@ -16155,7 +16155,7 @@ interpret a prefix argument.
 * Binary Functions::
 @end menu
 
-@node Basic Arithmetic, Integer Truncation, Arithmetic, Arithmetic
+@node Basic Arithmetic
 @section Basic Arithmetic
 
 @noindent
@@ -16512,7 +16512,7 @@ way floating-point numbers work.
 Incrementing a date/time form adjusts it by a certain number of seconds.
 Incrementing a pure date form adjusts it by a certain number of days.
 
-@node Integer Truncation, Complex Number Functions, Basic Arithmetic, 
Arithmetic
+@node Integer Truncation
 @section Integer Truncation
 
 @noindent
@@ -16635,7 +16635,7 @@ and @kbd{f Q} (integer square root) commands, which are 
analogous to
 @kbd{/}, @kbd{B}, and @kbd{Q}, respectively, except that they take integer
 arguments and return the result rounded down to an integer.
 
-@node Complex Number Functions, Conversions, Integer Truncation, Arithmetic
+@node Complex Number Functions
 @section Complex Number Functions
 
 @noindent
@@ -16703,7 +16703,7 @@ The @kbd{v u} (@code{calc-unpack}) command takes the 
complex number
 (or other composite object) on the top of the stack and unpacks it
 into its separate components.
 
-@node Conversions, Date Arithmetic, Complex Number Functions, Arithmetic
+@node Conversions
 @section Conversions
 
 @noindent
@@ -16866,7 +16866,7 @@ you wouldn't want it automatically converted to a 
100-digit integer).
 With the Hyperbolic flag, @kbd{H c c} and @kbd{H c 0} through @kbd{H c 9}
 operate non-pervasively [@code{clean}].
 
-@node Date Arithmetic, Financial Functions, Conversions, Arithmetic
+@node Date Arithmetic
 @section Date Arithmetic
 
 @noindent
@@ -16890,11 +16890,11 @@ additional argument from the top of the stack.
 @menu
 * Date Conversions::
 * Date Functions::
-* Time Zones::
 * Business Days::
+* Time Zones::
 @end menu
 
-@node Date Conversions, Date Functions, Date Arithmetic, Date Arithmetic
+@node Date Conversions
 @subsection Date Conversions
 
 @noindent
@@ -16982,7 +16982,7 @@ zone is used for that prompt.  You can also answer the 
first
 prompt with @kbd{$} to take the two time zone names from the
 stack (and the date to be converted from the third stack level).
 
-@node Date Functions, Business Days, Date Conversions, Date Arithmetic
+@node Date Functions
 @subsection Date Functions
 
 @noindent
@@ -17146,7 +17146,7 @@ serves this purpose.  Similarly, instead of 
@code{incday} and
 @xref{Basic Arithmetic}, for the @kbd{f ]} [@code{incr}] command
 which can adjust a date/time form by a certain number of seconds.
 
-@node Business Days, Time Zones, Date Functions, Date Arithmetic
+@node Business Days
 @subsection Business Days
 
 @noindent
@@ -17289,7 +17289,7 @@ any date form and returns 1 if that date falls on a 
weekend or
 holiday, as defined in @code{Holidays}, or 0 if the date is a
 business day.
 
-@node Time Zones,  , Business Days, Date Arithmetic
+@node Time Zones
 @subsection Time Zones
 
 @noindent
@@ -17511,7 +17511,7 @@ daylight saving time (e.g., @code{PDT} or @code{PST}) 
the
 the algorithms described above are used.  If @var{zone} is omitted,
 the computation is done for the current time zone.
 
-@node Financial Functions, Binary Functions, Date Arithmetic, Arithmetic
+@node Financial Functions
 @section Financial Functions
 
 @noindent
@@ -17538,7 +17538,7 @@ of this section to make sure the functions have the 
meaning you expect.
 * Definitions of Financial Functions::
 @end menu
 
-@node Percentages, Future Value, Financial Functions, Financial Functions
+@node Percentages
 @subsection Percentages
 
 @kindex M-%
@@ -17603,7 +17603,7 @@ in the second case, we're decreasing by 20% of 50.)  
The effect
 of @kbd{40 @key{RET} 50 b %} is to compute @expr{(50-40)/40}, converting
 the answer to percentage form as if by @kbd{c %}.
 
-@node Future Value, Present Value, Percentages, Financial Functions
+@node Future Value
 @subsection Future Value
 
 @noindent
@@ -17665,7 +17665,7 @@ now counting the payment at year five (which, since it 
didn't have
 a chance to earn interest, counts as $1000).  Indeed, @expr{5569.96 =
 5870.73 - 1300.78 + 1000} (give or take a bit of roundoff error).
 
-@node Present Value, Related Financial Functions, Future Value, Financial 
Functions
+@node Present Value
 @subsection Present Value
 
 @noindent
@@ -17749,7 +17749,7 @@ The @kbd{I b N} [@code{npvb}] command computes the net 
present
 value where payments occur at the beginning of each interval
 rather than at the end.
 
-@node Related Financial Functions, Depreciation Functions, Present Value, 
Financial Functions
+@node Related Financial Functions
 @subsection Related Financial Functions
 
 @noindent
@@ -17837,7 +17837,7 @@ this rate is known as the @dfn{internal rate of return}.
 The @kbd{I b I} [@code{irrb}] command computes the internal rate of
 return assuming payments occur at the beginning of each period.
 
-@node Depreciation Functions, Definitions of Financial Functions, Related 
Financial Functions, Financial Functions
+@node Depreciation Functions
 @subsection Depreciation Functions
 
 @noindent
@@ -17908,7 +17908,7 @@ Summing columns with @kbd{V R : +} yields @expr{[10000, 
10000, 10000]};
 the total depreciation in any method is (by definition) the
 difference between the cost and the salvage value.
 
-@node Definitions of Financial Functions,  , Depreciation Functions, Financial 
Functions
+@node Definitions of Financial Functions
 @subsection Definitions
 
 @noindent
@@ -18062,7 +18062,7 @@ and the depreciation is zero for all subsequent 
periods.  The @code{ddb}
 function returns the amount the book value decreased in the specified
 period.
 
-@node Binary Functions,  , Financial Functions, Arithmetic
+@node Binary Functions
 @section Binary Number Functions
 
 @noindent
@@ -18252,7 +18252,7 @@ unpack; type @kbd{31 @key{TAB} -} to replace each 
bit-number in the set
 with 31 minus that bit-number; type @kbd{b p} to pack the set back
 into a binary integer.
 
-@node Scientific Functions, Matrix Functions, Arithmetic, Top
+@node Scientific Functions
 @chapter Scientific Functions
 
 @noindent
@@ -18319,7 +18319,7 @@ interpret a prefix argument.
 * Probability Distribution Functions::
 @end menu
 
-@node Logarithmic Functions, Trigonometric and Hyperbolic Functions, 
Scientific Functions, Scientific Functions
+@node Logarithmic Functions
 @section Logarithmic Functions
 
 @noindent
@@ -18413,7 +18413,7 @@ The @kbd{f L} (@code{calc-lnp1}) [@code{lnp1}] command 
computes
 @infoline @expr{ln(x+1)},
 producing a more accurate answer when @expr{x} is close to zero.
 
-@node Trigonometric and Hyperbolic Functions, Advanced Math Functions, 
Logarithmic Functions, Scientific Functions
+@node Trigonometric and Hyperbolic Functions
 @section Trigonometric/Hyperbolic Functions
 
 @noindent
@@ -18590,7 +18590,7 @@ counterparts, which are also available separately as 
@code{calc-sech}
 [@code{sech}], @code{calc-csch} [@code{csch}] and @code{calc-coth}
 [@code{coth}].  (These commands do not accept the Inverse flag.)
 
-@node Advanced Math Functions, Branch Cuts, Trigonometric and Hyperbolic 
Functions, Scientific Functions
+@node Advanced Math Functions
 @section Advanced Mathematical Functions
 
 @noindent
@@ -18727,7 +18727,7 @@ Calc's implementation of the Bessel functions currently 
limits the
 precision to 8 digits, and may not be exact even to that precision.
 Use with care!
 
-@node Branch Cuts, Random Numbers, Advanced Math Functions, Scientific 
Functions
+@node Branch Cuts
 @section Branch Cuts and Principal Values
 
 @noindent
@@ -18871,7 +18871,7 @@ The ``advanced math'' functions (gamma, Bessel, etc.@:) 
are also defined
 for general complex arguments, but their branch cuts and principal values
 are not rigorously specified at present.
 
-@node Random Numbers, Combinatorial Functions, Branch Cuts, Scientific 
Functions
+@node Random Numbers
 @section Random Numbers
 
 @noindent
@@ -18999,7 +18999,7 @@ elements of this vector.  @xref{Matrix Functions}.
 * Random Number Generator::     (Complete description of Calc's algorithm)
 @end menu
 
-@node Random Number Generator,  , Random Numbers, Random Numbers
+@node Random Number Generator
 @subsection Random Number Generator
 
 Calc's random number generator uses several methods to ensure that
@@ -19097,7 +19097,7 @@ The Gaussian random numbers generated by 
@samp{random(0.0)} use the
 generates a pair of Gaussian random numbers at a time, so only every
 other call to @samp{random(0.0)} will require significant calculations.
 
-@node Combinatorial Functions, Probability Distribution Functions, Random 
Numbers, Scientific Functions
+@node Combinatorial Functions
 @section Combinatorial Functions
 
 @noindent
@@ -19313,7 +19313,7 @@ distinct factors, this is @expr{(-1)^k}.  If the input 
number has any
 duplicate factors (i.e., can be divided by the same prime more than once),
 the result is zero.
 
-@node Probability Distribution Functions,  , Combinatorial Functions, 
Scientific Functions
+@node Probability Distribution Functions
 @section Probability Distribution Functions
 
 @noindent
@@ -19464,7 +19464,7 @@ Since the distribution functions are monotonic, @kbd{a 
R} is guaranteed
 to be able to find a solution given any initial guess.
 @xref{Numerical Solutions}.
 
-@node Matrix Functions, Algebra, Scientific Functions, Top
+@node Matrix Functions
 @chapter Vector/Matrix Functions
 
 @noindent
@@ -19492,7 +19492,7 @@ vector of matrices, and so on.)
 * Vector and Matrix Formats::
 @end menu
 
-@node Packing and Unpacking, Building Vectors, Matrix Functions, Matrix 
Functions
+@node Packing and Unpacking
 @section Packing and Unpacking
 
 @noindent
@@ -19712,7 +19712,7 @@ Subscript notation is a useful way to extract a 
particular part
 of an object.  For example, to get the numerator of a rational
 number, you can use @samp{unpack(-10, @var{x})_1}.
 
-@node Building Vectors, Extracting Elements, Packing and Unpacking, Matrix 
Functions
+@node Building Vectors
 @section Building Vectors
 
 @noindent
@@ -19880,7 +19880,7 @@ representing the remainder of the vector.  Thus the 
vector
 Also, @samp{head([a, b, c, d]) = a}, @samp{tail([a, b, c, d]) = [b, c, d]},
 @samp{rhead([a, b, c, d]) = [a, b, c]}, and @samp{rtail([a, b, c, d]) = d}.
 
-@node Extracting Elements, Manipulating Vectors, Building Vectors, Matrix 
Functions
+@node Extracting Elements
 @section Extracting Vector Elements
 
 @noindent
@@ -19986,7 +19986,7 @@ produces @samp{[a, d, e]}.  It is always true that 
@code{subvec} and
 @xref{Selecting Subformulas}, for an alternative way to operate on
 vectors one element at a time.
 
-@node Manipulating Vectors, Vector and Matrix Arithmetic, Extracting Elements, 
Matrix Functions
+@node Manipulating Vectors
 @section Manipulating Vectors
 
 @noindent
@@ -20218,7 +20218,7 @@ operation across the two vectors.  @xref{Logical 
Operations}.  Note that
 the @code{? :} operation also discussed there allows other types of
 masking using vectors.
 
-@node Vector and Matrix Arithmetic, Set Operations, Manipulating Vectors, 
Matrix Functions
+@node Vector and Matrix Arithmetic
 @section Vector and Matrix Arithmetic
 
 @noindent
@@ -20340,7 +20340,7 @@ elements of the matrix.
 The @kbd{V K} (@code{calc-kron}) [@code{kron}] command computes
 the Kronecker product of two matrices.
 
-@node Set Operations, Statistical Operations, Vector and Matrix Arithmetic, 
Matrix Functions
+@node Set Operations
 @section Set Operations using Vectors
 
 @noindent
@@ -20530,7 +20530,7 @@ representation
 @texline (@math{2^{100}}, a 31-digit integer, in this case).
 @infoline (@expr{2^100}, a 31-digit integer, in this case).
 
-@node Statistical Operations, Reducing and Mapping, Set Operations, Matrix 
Functions
+@node Statistical Operations
 @section Statistical Operations on Vectors
 
 @noindent
@@ -20559,7 +20559,7 @@ probability distribution functions.
 * Paired-Sample Statistics::
 @end menu
 
-@node Single-Variable Statistics, Paired-Sample Statistics, Statistical 
Operations, Statistical Operations
+@node Single-Variable Statistics
 @subsection Single-Variable Statistics
 
 @noindent
@@ -20828,7 +20828,7 @@ arguments, interpreted in the same way as the other 
functions
 in this section.  For example, @samp{vflat(1, [2, [3, 4]], 5)}
 returns @samp{[1, 2, 3, 4, 5]}.
 
-@node Paired-Sample Statistics,  , Single-Variable Statistics, Statistical 
Operations
+@node Paired-Sample Statistics
 @subsection Paired-Sample Statistics
 
 @noindent
@@ -20889,7 +20889,7 @@ between sample or population statistics here.)
 $$ r_{x\!y} = { \sigma_{x\!y}^2 \over \sigma_x^2 \sigma_y^2 } $$
 @end tex
 
-@node Reducing and Mapping, Vector and Matrix Formats, Statistical Operations, 
Matrix Functions
+@node Reducing and Mapping
 @section Reducing and Mapping Vectors
 
 @noindent
@@ -20919,7 +20919,7 @@ While @kbd{V A} is useful in some cases, you will 
usually find that either
 * Generalized Products::
 @end menu
 
-@node Specifying Operators, Mapping, Reducing and Mapping, Reducing and Mapping
+@node Specifying Operators
 @subsection Specifying Operators
 
 @noindent
@@ -21070,7 +21070,7 @@ a function, since the name @code{gcd} corresponds to 
the Lisp variable
 automatically makes this translation, so you don't have to worry
 about it.)
 
-@node Mapping, Reducing, Specifying Operators, Reducing and Mapping
+@node Mapping
 @subsection Mapping
 
 @noindent
@@ -21167,7 +21167,7 @@ mapping command.  The default @kbd{V M} always means 
map-by-elements.
 @xref{Storing Variables}, for the @kbd{s m} command which modifies a
 variable's stored value using a @kbd{V M}-like operator.
 
-@node Reducing, Nesting and Fixed Points, Mapping, Reducing and Mapping
+@node Reducing
 @subsection Reducing
 
 @noindent
@@ -21248,7 +21248,7 @@ The commands @kbd{C-x * :} and @kbd{C-x * _} are 
equivalent to typing
 @kbd{V R : +} or @kbd{V R _ +}, respectively, to sum the columns or
 rows of the matrix.  @xref{Grabbing From Buffers}.
 
-@node Nesting and Fixed Points, Generalized Products, Reducing, Reducing and 
Mapping
+@node Nesting and Fixed Points
 @subsection Nesting and Fixed Points
 
 @noindent
@@ -21328,7 +21328,7 @@ computes the square root of @samp{A} given the initial 
guess @samp{B},
 stopping when the result is correct within the specified tolerance, or
 when 20 steps have been taken, whichever is sooner.
 
-@node Generalized Products,  , Nesting and Fixed Points, Reducing and Mapping
+@node Generalized Products
 @subsection Generalized Products
 
 @kindex v O
@@ -21365,7 +21365,7 @@ use @kbd{$} twice to take both operator formulas from 
the stack, the
 first (multiplicative) operator is taken from the top of the stack
 and the second (additive) operator is taken from second-to-top.
 
-@node Vector and Matrix Formats,  , Reducing and Mapping, Matrix Functions
+@node Vector and Matrix Formats
 @section Vector and Matrix Display Formats
 
 @noindent
@@ -21512,7 +21512,7 @@ line.  This mode causes all vectors, whether matrices 
or not, to be
 displayed with a single element per line.  Sub-vectors within the
 vectors will still use the normal linear form.
 
-@node Algebra, Units, Matrix Functions, Top
+@node Algebra
 @chapter Algebra
 
 @noindent
@@ -21552,7 +21552,7 @@ of these modes.  You may also wish to select Big 
display mode (@kbd{d B}).
 * Rewrite Rules::
 @end menu
 
-@node Selecting Subformulas, Algebraic Manipulation, Algebra, Algebra
+@node Selecting Subformulas
 @section Selecting Sub-Formulas
 
 @noindent
@@ -21578,7 +21578,7 @@ on one element of a vector in-place, simply select that 
element as a
 * Rearranging with Selections::
 @end menu
 
-@node Making Selections, Changing Selections, Selecting Subformulas, Selecting 
Subformulas
+@node Making Selections
 @subsection Making Selections
 
 @noindent
@@ -21739,7 +21739,7 @@ position.
 The @kbd{j c} (@code{calc-clear-selections}) command unselects all
 stack elements.
 
-@node Changing Selections, Displaying Selections, Making Selections, Selecting 
Subformulas
+@node Changing Selections
 @subsection Changing Selections
 
 @noindent
@@ -21828,7 +21828,7 @@ The Info @kbd{m} command is somewhat similar to Calc's 
@kbd{j s} and
 @kbd{j l}; in each case, you can jump directly to a sub-component
 of the hierarchy simply by pointing to it with the cursor.
 
-@node Displaying Selections, Operating on Selections, Changing Selections, 
Selecting Subformulas
+@node Displaying Selections
 @subsection Displaying Selections
 
 @noindent
@@ -21859,7 +21859,7 @@ and the selected sub-formula will be highlighted by 
using a more
 noticeable face (@code{calc-selected-face}) instead of @samp{#}
 signs. (@pxref{Customizing Calc}.)
 
-@node Operating on Selections, Rearranging with Selections, Displaying 
Selections, Selecting Subformulas
+@node Operating on Selections
 @subsection Operating on Selections
 
 @noindent
@@ -22016,7 +22016,7 @@ to be simplified.
 @end group
 @end smallexample
 
-@node Rearranging with Selections,  , Operating on Selections, Selecting 
Subformulas
+@node Rearranging with Selections
 @subsection Rearranging Formulas using Selections
 
 @noindent
@@ -22265,7 +22265,7 @@ The @kbd{j "} (@code{calc-sel-expand-formula}) command 
is to @kbd{a "}
 You can use the @kbd{j r} (@code{calc-rewrite-selection}) command
 to define other algebraic operations on sub-formulas.  @xref{Rewrite Rules}.
 
-@node Algebraic Manipulation, Simplifying Formulas, Selecting Subformulas, 
Algebra
+@node Algebraic Manipulation
 @section Algebraic Manipulation
 
 @noindent
@@ -22429,7 +22429,7 @@ evaluated immediately, even if its arguments are 
variables, so if
 you wish to put a call to @code{subst} onto the stack you must
 turn the default simplifications off first (with @kbd{m O}).
 
-@node Simplifying Formulas, Polynomials, Algebraic Manipulation, Algebra
+@node Simplifying Formulas
 @section Simplifying Formulas
 
 @noindent
@@ -22478,7 +22478,7 @@ combinations of @samp{sinh}s and @samp{cosh}s before 
simplifying.
 * Simplification of Units::
 @end menu
 
-@node Basic Simplifications, Algebraic Simplifications, Simplifying Formulas, 
Simplifying Formulas
+@node Basic Simplifications
 @subsection Basic Simplifications
 
 @noindent
@@ -22808,7 +22808,7 @@ Most other Calc functions have few if any basic 
simplifications
 defined, aside of course from evaluation when the arguments are
 suitable numbers.
 
-@node Algebraic Simplifications, Unsafe Simplifications, Basic 
Simplifications, Simplifying Formulas
+@node Algebraic Simplifications
 @subsection Algebraic Simplifications
 
 @noindent
@@ -23041,7 +23041,7 @@ all simplified to 0, but @expr{x > 3} is simplified to 
1.
 By a similar analysis, @expr{abs(x) >= 0} is simplified to 1,
 as is @expr{x^2 >= 0} if @expr{x} is known to be real.
 
-@node Unsafe Simplifications, Simplification of Units, Algebraic 
Simplifications, Simplifying Formulas
+@node Unsafe Simplifications
 @subsection ``Unsafe'' Simplifications
 
 @noindent
@@ -23134,7 +23134,7 @@ on whether you believe @expr{x} is positive or 
negative).
 The @kbd{a M /} command can be used to divide a factor out of
 both sides of an inequality.
 
-@node Simplification of Units,  , Unsafe Simplifications, Simplifying Formulas
+@node Simplification of Units
 @subsection Simplification of Units
 
 @noindent
@@ -23219,7 +23219,7 @@ that have angular units like @code{rad} or 
@code{arcmin} are
 simplified by converting to base units (radians), then evaluating
 with the angular mode temporarily set to radians.
 
-@node Polynomials, Calculus, Simplifying Formulas, Algebra
+@node Polynomials
 @section Polynomials
 
 A @dfn{polynomial} is a sum of terms which are coefficients times
@@ -23443,7 +23443,7 @@ polynomial routines used in the above commands.
 @xref{Decomposing Polynomials}, for several useful functions for
 extracting the individual coefficients of a polynomial.
 
-@node Calculus, Solving Equations, Polynomials, Algebra
+@node Calculus
 @section Calculus
 
 @noindent
@@ -23461,7 +23461,7 @@ readable way.
 * Taylor Series::
 @end menu
 
-@node Differentiation, Integration, Calculus, Calculus
+@node Differentiation
 @subsection Differentiation
 
 @noindent
@@ -23519,7 +23519,7 @@ Various higher-order derivatives can be formed in the 
obvious way, e.g.,
 @samp{f'@var{}'2'3(x,y,z)} (@code{f} differentiated with respect to each
 argument once).
 
-@node Integration, Customizing the Integrator, Differentiation, Calculus
+@node Integration
 @subsection Integration
 
 @noindent
@@ -23606,7 +23606,7 @@ table-lookup solutions of integrals.  You might then 
wish to define
 rewrite rules for integration by parts, various kinds of substitutions,
 and so on.  @xref{Rewrite Rules}.
 
-@node Customizing the Integrator, Numerical Integration, Integration, Calculus
+@node Customizing the Integrator
 @subsection Customizing the Integrator
 
 @noindent
@@ -23732,7 +23732,7 @@ of times until no further changes are possible.  
Rewriting by
 finished, not at every step as for @code{IntegRules} and
 @code{IntegSimpRules}.
 
-@node Numerical Integration, Taylor Series, Customizing the Integrator, 
Calculus
+@node Numerical Integration
 @subsection Numerical Integration
 
 @noindent
@@ -23770,7 +23770,7 @@ The integral of @samp{1/sqrt(x)} from 0 to 1 exists (it 
can be found
 by Calc's symbolic integrator, for example), but @kbd{a I} will fail
 because the integrand goes to infinity at one of the endpoints.
 
-@node Taylor Series,  , Numerical Integration, Calculus
+@node Taylor Series
 @subsection Taylor Series
 
 @noindent
@@ -23791,7 +23791,7 @@ If the @kbd{a i} command is unable to find a symbolic 
integral for a
 function, you can get an approximation by integrating the function's
 Taylor series.
 
-@node Solving Equations, Numerical Solutions, Calculus, Algebra
+@node Solving Equations
 @section Solving Equations
 
 @noindent
@@ -23835,7 +23835,7 @@ another formula with @expr{x} set equal to @expr{y/3 - 
2}.
 * Decomposing Polynomials::
 @end menu
 
-@node Multiple Solutions, Solving Systems of Equations, Solving Equations, 
Solving Equations
+@node Multiple Solutions
 @subsection Multiple Solutions
 
 @noindent
@@ -23949,7 +23949,7 @@ formula on the stack with Symbolic mode temporarily 
off.)  Naturally,
 @kbd{a P} can only provide numerical roots if the polynomial coefficients
 are all numbers (real or complex).
 
-@node Solving Systems of Equations, Decomposing Polynomials, Multiple 
Solutions, Solving Equations
+@node Solving Systems of Equations
 @subsection Solving Systems of Equations
 
 @noindent
@@ -24016,7 +24016,7 @@ Another way to deal with certain kinds of 
overdetermined systems of
 equations is the @kbd{a F} command, which does least-squares fitting
 to satisfy the equations.  @xref{Curve Fitting}.
 
-@node Decomposing Polynomials,  , Solving Systems of Equations, Solving 
Equations
+@node Decomposing Polynomials
 @subsection Decomposing Polynomials
 
 @noindent
@@ -24160,7 +24160,7 @@ if necessary) by its content.  If the input polynomial 
has rational
 coefficients, the result will have integer coefficients in simplest
 terms.
 
-@node Numerical Solutions, Curve Fitting, Solving Equations, Algebra
+@node Numerical Solutions
 @section Numerical Solutions
 
 @noindent
@@ -24179,7 +24179,7 @@ on numerical data.)
 * Numerical Systems of Equations::
 @end menu
 
-@node Root Finding, Minimization, Numerical Solutions, Numerical Solutions
+@node Root Finding
 @subsection Root Finding
 
 @noindent
@@ -24255,7 +24255,7 @@ form on the stack, it will normally display an 
explanation for why
 no root was found.  If you miss this explanation, press @kbd{w}
 (@code{calc-why}) to get it back.
 
-@node Minimization, Numerical Systems of Equations, Root Finding, Numerical 
Solutions
+@node Minimization
 @subsection Minimization
 
 @noindent
@@ -24327,7 +24327,7 @@ the initial guess is a complex number the variable will 
be minimized
 over the complex numbers; if it is real or an interval it will
 be minimized over the reals.
 
-@node Numerical Systems of Equations,  , Minimization, Numerical Solutions
+@node Numerical Systems of Equations
 @subsection Systems of Equations
 
 @noindent
@@ -24353,7 +24353,7 @@ multidimensional @kbd{a R}, the formula being minimized 
should
 still be a single formula, @emph{not} a vector.  Beware that
 multidimensional minimization is currently @emph{very} slow.
 
-@node Curve Fitting, Summations, Numerical Solutions, Algebra
+@node Curve Fitting
 @section Curve Fitting
 
 @noindent
@@ -24379,7 +24379,7 @@ plotted after the formula is determined.  This will be 
indicated by a
 * Interpolation::
 @end menu
 
-@node Linear Fits, Polynomial and Multilinear Fits, Curve Fitting, Curve 
Fitting
+@node Linear Fits
 @subsection Linear Fits
 
 @noindent
@@ -24545,7 +24545,7 @@ vector of @expr{y} values.  If there is only one 
independent variable,
 the @expr{x} values can be either a one-row matrix or a plain vector,
 in which case the @kbd{C-u} prefix is the same as a @w{@kbd{C-u 2}} prefix.
 
-@node Polynomial and Multilinear Fits, Error Estimates for Fits, Linear Fits, 
Curve Fitting
+@node Polynomial and Multilinear Fits
 @subsection Polynomial and Multilinear Fits
 
 @noindent
@@ -24660,7 +24660,7 @@ would enter @kbd{a F ' 2.3 + a x}.
 Another class of models that will work but must be entered by hand
 are multinomial fits, e.g., @expr{a + b x + c y + d x^2 + e y^2 + f x y}.
 
-@node Error Estimates for Fits, Standard Nonlinear Models, Polynomial and 
Multilinear Fits, Curve Fitting
+@node Error Estimates for Fits
 @subsection Error Estimates for Fits
 
 @noindent
@@ -24821,7 +24821,7 @@ in the input, and thus there is no redundant 
information left
 over to use for a confidence test.
 @end enumerate
 
-@node Standard Nonlinear Models, Curve Fitting Details, Error Estimates for 
Fits, Curve Fitting
+@node Standard Nonlinear Models
 @subsection Standard Nonlinear Models
 
 @noindent
@@ -25005,7 +25005,7 @@ Fourier analysis, which is beyond the scope of the 
@kbd{a F} command.
 (Unfortunately, Calc does not currently have any facilities for
 taking Fourier and related transforms.)
 
-@node Curve Fitting Details, Interpolation, Standard Nonlinear Models, Curve 
Fitting
+@node Curve Fitting Details
 @subsection Curve Fitting Details
 
 @noindent
@@ -25397,7 +25397,7 @@ linearizer was unable to put the model into the 
required form.
 The @code{efit} (corresponding to @kbd{H a F}) and @code{xfit}
 (for @kbd{I a F}) functions are completely analogous.
 
-@node Interpolation,  , Curve Fitting Details, Curve Fitting
+@node Interpolation
 @subsection Polynomial Interpolation
 
 @kindex a p
@@ -25454,7 +25454,7 @@ used by @kbd{H a p}.  (The algorithm never generates 
these coefficients
 explicitly, and quotients of polynomials are beyond @w{@kbd{a F}}'s
 capabilities to fit.)
 
-@node Summations, Logical Operations, Curve Fitting, Algebra
+@node Summations
 @section Summations
 
 @noindent
@@ -25615,7 +25615,7 @@ like @code{sum} and @code{prod}, but its result is 
simply a
 vector of the results.  For example, @samp{table(a_i, i, 1, 7, 2)}
 produces @samp{[a_1, a_3, a_5, a_7]}.
 
-@node Logical Operations, Rewrite Rules, Summations, Algebra
+@node Logical Operations
 @section Logical Operations
 
 @noindent
@@ -25993,7 +25993,7 @@ declarations are used when deciding whether a formula 
is true;
 it returns 0 when @code{dnonzero} would return 0 or leave itself
 in symbolic form.)
 
-@node Rewrite Rules,  , Logical Operations, Algebra
+@node Rewrite Rules
 @section Rewrite Rules
 
 @noindent
@@ -26035,7 +26035,7 @@ Calc formulas.
 * Examples of Rewrite Rules::
 @end menu
 
-@node Entering Rewrite Rules, Basic Rewrite Rules, Rewrite Rules, Rewrite Rules
+@node Entering Rewrite Rules
 @subsection Entering Rewrite Rules
 
 @noindent
@@ -26101,7 +26101,7 @@ Calc also accepts an obsolete notation for rules, as 
vectors
 @samp{[@var{old}, @var{new}]}.  But because it is easily confused with a
 vector of two rules, the use of this notation is no longer recommended.
 
-@node Basic Rewrite Rules, Conditional Rewrite Rules, Entering Rewrite Rules, 
Rewrite Rules
+@node Basic Rewrite Rules
 @subsection Basic Rewrite Rules
 
 @noindent
@@ -26145,7 +26145,7 @@ throughout the target formula until no further changes 
are possible
 (up to a limit of 100 times).  Use @kbd{C-u 1 a r} to make only one
 change at a time.
 
-@node Conditional Rewrite Rules, Algebraic Properties of Rewrite Rules, Basic 
Rewrite Rules, Rewrite Rules
+@node Conditional Rewrite Rules
 @subsection Conditional Rewrite Rules
 
 @noindent
@@ -26228,7 +26228,7 @@ the condition @samp{1} is always true (nonzero) so it 
has no effect on
 the functioning of the rule.  (The rewrite compiler will ensure that
 it doesn't even impact the speed of matching the rule.)
 
-@node Algebraic Properties of Rewrite Rules, Other Features of Rewrite Rules, 
Conditional Rewrite Rules, Rewrite Rules
+@node Algebraic Properties of Rewrite Rules
 @subsection Algebraic Properties of Rewrite Rules
 
 @noindent
@@ -26567,7 +26567,7 @@ In this example, we are still allowing the 
pattern-matcher to
 use all the algebra it can muster, but the righthand side will
 always simplify to a literal addition like @samp{f((-y) + x)}.
 
-@node Other Features of Rewrite Rules, Composing Patterns in Rewrite Rules, 
Algebraic Properties of Rewrite Rules, Rewrite Rules
+@node Other Features of Rewrite Rules
 @subsection Other Features of Rewrite Rules
 
 @noindent
@@ -26969,7 +26969,7 @@ rule remembers only every fourth result.  Note that 
@samp{remember(1)}
 is equivalent to @samp{remember}, and @samp{remember(0)} has no effect.
 @end table
 
-@node Composing Patterns in Rewrite Rules, Nested Formulas with Rewrite Rules, 
Other Features of Rewrite Rules, Rewrite Rules
+@node Composing Patterns in Rewrite Rules
 @subsection Composing Patterns in Rewrite Rules
 
 @noindent
@@ -27138,7 +27138,7 @@ disastrous: since @code{a} was unbound so far, the 
pattern @samp{a}
 would have matched anything at all, and the pattern @samp{!!!a}
 therefore would @emph{not} have matched anything at all!
 
-@node Nested Formulas with Rewrite Rules, Multi-Phase Rewrite Rules, Composing 
Patterns in Rewrite Rules, Rewrite Rules
+@node Nested Formulas with Rewrite Rules
 @subsection Nested Formulas with Rewrite Rules
 
 @noindent
@@ -27222,7 +27222,7 @@ integer, or @samp{inf} or @samp{-inf}.  If @var{n} is 
omitted
 the @code{iterations} value from the rule set is used; if both
 are omitted, 100 is used.
 
-@node Multi-Phase Rewrite Rules, Selections with Rewrite Rules, Nested 
Formulas with Rewrite Rules, Rewrite Rules
+@node Multi-Phase Rewrite Rules
 @subsection Multi-Phase Rewrite Rules
 
 @noindent
@@ -27343,7 +27343,7 @@ rules were finished, some components might be put away 
into vectors
 before they had a chance to recombine.  By putting these rules in
 two separate phases, this problem is neatly avoided.
 
-@node Selections with Rewrite Rules, Matching Commands, Multi-Phase Rewrite 
Rules, Rewrite Rules
+@node Selections with Rewrite Rules
 @subsection Selections with Rewrite Rules
 
 @noindent
@@ -27416,7 +27416,7 @@ purpose rules with @samp{select( )} hints inside them 
so that they
 will ``do the right thing'' in both @kbd{a r} and @kbd{j r},
 both with and without selections.
 
-@node Matching Commands, Automatic Rewrites, Selections with Rewrite Rules, 
Rewrite Rules
+@node Matching Commands
 @subsection Matching Commands
 
 @noindent
@@ -27468,7 +27468,7 @@ the meta-variables instead of the number 1.  For 
example,
 @samp{vmatches(f(1,2), f(a,b))} returns @samp{[a := 1, b := 2]}.
 If the match fails, the function returns the number 0.
 
-@node Automatic Rewrites, Debugging Rewrites, Matching Commands, Rewrite Rules
+@node Automatic Rewrites
 @subsection Automatic Rewrites
 
 @noindent
@@ -27642,7 +27642,7 @@ also apply @code{EvalRules} and @code{AlgSimpRules}.  
The variable
 @code{IntegSimpRules} contains simplification rules that are used
 only during integration by @kbd{a i}.
 
-@node Debugging Rewrites, Examples of Rewrite Rules, Automatic Rewrites, 
Rewrite Rules
+@node Debugging Rewrites
 @subsection Debugging Rewrites
 
 @noindent
@@ -27662,7 +27662,7 @@ buffer (with @kbd{C-x k *Trace* @key{RET}}).  If you 
leave it in
 existence and forget about it, all your future rewrite commands will
 be needlessly slow.
 
-@node Examples of Rewrite Rules,  , Debugging Rewrites, Rewrite Rules
+@node Examples of Rewrite Rules
 @subsection Examples of Rewrite Rules
 
 @noindent
@@ -27752,7 +27752,7 @@ results in the four-argument form, just append the two 
items
 of the rule set.  (But remember that multi-phase rule sets don't work
 in @code{EvalRules}.)
 
-@node Units, Store and Recall, Algebra, Top
+@node Units
 @chapter Operating on Units
 
 @noindent
@@ -27771,7 +27771,7 @@ begin with the @kbd{u} prefix key.
 * Musical Notes::
 @end menu
 
-@node Basic Operations on Units, The Units Table, Units, Units
+@node Basic Operations on Units
 @section Basic Operations on Units
 
 @noindent
@@ -27976,7 +27976,7 @@ is also the actual name of another unit; @samp{1e-15 t} 
would normally
 be considered a ``femto-ton,'' but it is written as @samp{1000 at}
 (1000 atto-tons) instead because @code{ft} would be confused with feet.
 
-@node The Units Table, Predefined Units, Basic Operations on Units, Units
+@node The Units Table
 @section The Units Table
 
 @noindent
@@ -28033,7 +28033,7 @@ for the expression @samp{62 km^2 g / s^2 mol K}, the 
description is
 command uses the English descriptions that appear in the righthand
 column of the Units Table.
 
-@node Predefined Units, User-Defined Units, The Units Table, Units
+@node Predefined Units
 @section Predefined Units
 
 @noindent
@@ -28130,7 +28130,7 @@ really is unitless.)
 
 @c Describe angular units, luminosity vs. steradians problem.
 
-@node User-Defined Units, Logarithmic Units, Predefined Units, Units
+@node User-Defined Units
 @section User-Defined Units
 
 @noindent
@@ -28214,7 +28214,7 @@ was already a set of user-defined units in your Calc 
init file, it
 is replaced by the new set.  (@xref{General Mode Commands}, for a way to
 tell Calc to use a different file for the Calc init file.)
 
-@node Logarithmic Units, Musical Notes, User-Defined Units, Units
+@node Logarithmic Units
 @section Logarithmic Units
 
 The units @code{dB} (decibels) and @code{Np} (nepers) are logarithmic
@@ -28453,7 +28453,7 @@ number; the @kbd{l /} (@code{calc-lu-divide}) 
[@code{lupdiv}] and
 unit by a number. Note that the reference quantities don't play a role
 in this arithmetic.
 
-@node Musical Notes, , Logarithmic Units, Units
+@node Musical Notes
 @section Musical Notes
 
 Calc can convert between musical notes and their associated
@@ -28521,7 +28521,7 @@ notation @code{B_3 + 99.9962592773 cents}; with the 
default value of
 @code{1}, Calc converts @code{261.625 Hz} to @code{C_4}.
 
 
-@node Store and Recall, Graphics, Units, Top
+@node Store and Recall
 @chapter Storing and Recalling
 
 @noindent
@@ -28538,7 +28538,7 @@ to variables use the @kbd{s} prefix key.
 * Evaluates-To Operator::
 @end menu
 
-@node Storing Variables, Recalling Variables, Store and Recall, Store and 
Recall
+@node Storing Variables
 @section Storing Variables
 
 @noindent
@@ -28766,7 +28766,7 @@ stored in the Calc variable @code{pi}.  If one of the 
other special
 variables, @code{inf}, @code{uinf} or @code{nan}, is given a value, its
 original behavior can be restored by voiding it with @kbd{s u}.
 
-@node Recalling Variables, Operations on Variables, Storing Variables, Store 
and Recall
+@node Recalling Variables
 @section Recalling Variables
 
 @noindent
@@ -28789,7 +28789,7 @@ latter will produce an error message.
 The @kbd{r} prefix may be followed by a digit, so that @kbd{r 9} is
 equivalent to @kbd{s r 9}.
 
-@node Operations on Variables, Let Command, Recalling Variables, Store and 
Recall
+@node Operations on Variables
 @section Other Operations on Variables
 
 @noindent
@@ -28946,7 +28946,7 @@ omits the same set of variables as @w{@kbd{s p 
@key{RET}}}; the difference
 is that @kbd{s i} will store the variables in any buffer, and it also
 stores in a more human-readable format.)
 
-@node Let Command, Evaluates-To Operator, Operations on Variables, Store and 
Recall
+@node Let Command
 @section The Let Command
 
 @noindent
@@ -28984,7 +28984,7 @@ example, letting @expr{n=2} in @samp{f(n pi)} with 
@kbd{a b} will
 produce @samp{f(2 pi)}, whereas @kbd{s l} would give @samp{f(6.28)}
 since the evaluation step will also evaluate @code{pi}.
 
-@node Evaluates-To Operator,  , Let Command, Store and Recall
+@node Evaluates-To Operator
 @section The Evaluates-To Operator
 
 @noindent
@@ -29110,7 +29110,7 @@ and value from the stack and replaces them with an 
assignment.
 @TeX{} language output.  The @dfn{eqn} mode gives similar
 treatment to @samp{=>}.
 
-@node Graphics, Kill and Yank, Store and Recall, Top
+@node Graphics
 @chapter Graphics
 
 @noindent
@@ -29141,7 +29141,7 @@ POSIX-compatible terminal.
 * Devices::
 @end menu
 
-@node Basic Graphics, Three Dimensional Graphics, Graphics, Graphics
+@node Basic Graphics
 @section Basic Graphics
 
 @noindent
@@ -29227,7 +29227,7 @@ to use @kbd{g c} if you don't want to---if you give 
another @kbd{g f}
 or @kbd{g p} command later on, it will reuse the existing graphics
 window if there is one.
 
-@node Three Dimensional Graphics, Managing Curves, Basic Graphics, Graphics
+@node Three Dimensional Graphics
 @section Three-Dimensional Graphics
 
 @kindex g F
@@ -29295,7 +29295,7 @@ helix (a three-dimensional spiral).
 As for @kbd{g f}, each of ``x'', ``y'', and ``z'' may instead be
 variables containing the relevant data.
 
-@node Managing Curves, Graphics Options, Three Dimensional Graphics, Graphics
+@node Managing Curves
 @section Managing Curves
 
 @noindent
@@ -29454,7 +29454,7 @@ Provided everything is set up properly, @kbd{g p} will 
plot to
 the screen unless you have specified otherwise and @kbd{g P} will
 always plot to the printer.
 
-@node Graphics Options, Devices, Managing Curves, Graphics
+@node Graphics Options
 @section Graphics Options
 
 @noindent
@@ -29620,7 +29620,7 @@ lines, and the third curve to have lines in style 3.  
Point styles will
 still be assigned automatically, but you could store another vector in
 @code{PointStyles} to define them, too.
 
-@node Devices,  , Graphics Options, Graphics
+@node Devices
 @section Graphical Devices
 
 @noindent
@@ -29813,7 +29813,7 @@ except that it also views the @file{*Gnuplot Trail*} 
buffer so that
 you can see the process being killed.  This is better if you are
 killing GNUPLOT because you think it has gotten stuck.
 
-@node Kill and Yank, Keypad Mode, Graphics, Top
+@node Kill and Yank
 @chapter Kill and Yank Functions
 
 @noindent
@@ -29833,7 +29833,7 @@ work with Calc from a regular editing buffer.  
@xref{Embedded Mode}.
 * X Cut and Paste::
 @end menu
 
-@node Killing From Stack, Yanking Into Stack, Kill and Yank, Kill and Yank
+@node Killing From Stack
 @section Killing from the Stack
 
 @noindent
@@ -29877,7 +29877,7 @@ with no argument copies only the number itself into the 
kill ring, whereas
 @kbd{C-k} with a prefix argument of 1 copies the number with its trailing
 newline.
 
-@node Yanking Into Stack, Saving Into Registers, Killing From Stack, Kill and 
Yank
+@node Yanking Into Stack
 @section Yanking into the Stack
 
 @noindent
@@ -29909,7 +29909,7 @@ allow the text being yanked to be read in a different 
base (such as if
 the text is an algebraic expression), then the prefix will have no
 effect.
 
-@node Saving Into Registers, Inserting From Registers, Yanking Into Stack, 
Kill and Yank
+@node Saving Into Registers
 @section Saving into Registers
 
 @noindent
@@ -29943,7 +29943,7 @@ region to the beginning of the register contents.  Both 
commands take
 @kbd{C-u} arguments, which will cause the region to be deleted after being
 added to the register.
 
-@node Inserting From Registers, Grabbing From Buffers, Saving Into Registers, 
Kill and Yank
+@node Inserting From Registers
 @section Inserting from Registers
 @noindent
 @kindex r i
@@ -29955,7 +29955,7 @@ within Calc, then the full internal structure of the 
contents will be
 inserted into the Calculator, otherwise whatever text is in the
 register is reparsed and then inserted into the Calculator.
 
-@node Grabbing From Buffers, Yanking Into Buffers, Inserting From Registers, 
Kill and Yank
+@node Grabbing From Buffers
 @section Grabbing from Other Buffers
 
 @noindent
@@ -30072,7 +30072,7 @@ handy way to find the product of a vector or matrix of 
numbers.
 @xref{Statistical Operations}.  Another approach would be to use
 an explicit column reduction command, @kbd{V R : *}.
 
-@node Yanking Into Buffers, X Cut and Paste, Grabbing From Buffers, Kill and 
Yank
+@node Yanking Into Buffers
 @section Yanking into Other Buffers
 
 @noindent
@@ -30126,7 +30126,7 @@ The @kbd{C-x * y} key sequence is equivalent to @kbd{y} 
except that
 it can be typed anywhere, not just in Calc.  This provides an easy
 way to guarantee that Calc knows which editing buffer you want to use!
 
-@node X Cut and Paste,  , Yanking Into Buffers, Kill and Yank
+@node X Cut and Paste
 @section X Cut and Paste
 
 @noindent
@@ -30155,7 +30155,7 @@ whole line.  So you can usually transfer a single 
number into Calc
 just by double-clicking on it in the shell, then middle-clicking
 in the Calc window.
 
-@node Keypad Mode, Embedded Mode, Kill and Yank, Top
+@node Keypad Mode
 @chapter Keypad Mode
 
 @noindent
@@ -30207,7 +30207,7 @@ original buffer.
 * Keypad Modes Menu::
 @end menu
 
-@node Keypad Main Menu, Keypad Functions Menu, Keypad Mode, Keypad Mode
+@node Keypad Main Menu
 @section Main Menu
 
 @smallexample
@@ -30338,7 +30338,7 @@ running standalone (the @code{full-calc-keypad} command 
appeared in the
 command line that started Emacs), then @kbd{OFF} is replaced with
 @kbd{EXIT}; clicking on this actually exits Emacs itself.
 
-@node Keypad Functions Menu, Keypad Binary Menu, Keypad Main Menu, Keypad Mode
+@node Keypad Functions Menu
 @section Functions Menu
 
 @smallexample
@@ -30381,7 +30381,7 @@ same limit as last time.
 @key{NXTP} finds the next prime after a number.  @kbd{INV NXTP}
 finds the previous prime.
 
-@node Keypad Binary Menu, Keypad Vectors Menu, Keypad Functions Menu, Keypad 
Mode
+@node Keypad Binary Menu
 @section Binary Menu
 
 @smallexample
@@ -30414,7 +30414,7 @@ and allows you to enter a new word size.  You can 
respond to the prompt
 using either the keyboard or the digits and @key{ENTER} from the keypad.
 The initial word size is 32 bits.
 
-@node Keypad Vectors Menu, Keypad Modes Menu, Keypad Binary Menu, Keypad Mode
+@node Keypad Vectors Menu
 @section Vectors Menu
 
 @smallexample
@@ -30496,7 +30496,7 @@ With @key{INV}, @key{HYP}, or @key{INV} and @key{HYP}, 
the
 @kbd{"x"} key pushes the variable names @expr{y}, @expr{z}, and
 @expr{t}, respectively.
 
-@node Keypad Modes Menu,  , Keypad Vectors Menu, Keypad Mode
+@node Keypad Modes Menu
 @section Modes Menu
 
 @smallexample
@@ -30552,7 +30552,7 @@ The @key{STO} and @key{RCL} keys are analogous to 
@kbd{s t} and
 variables are not available in Keypad mode.)  You can also use,
 for example, @kbd{STO + 3} to add to register 3.
 
-@node Embedded Mode, Programming, Keypad Mode, Top
+@node Embedded Mode
 @chapter Embedded Mode
 
 @noindent
@@ -30569,7 +30569,7 @@ linked to the stack and this copying is taken care of 
automatically.
 * Customizing Embedded Mode::
 @end menu
 
-@node Basic Embedded Mode, More About Embedded Mode, Embedded Mode, Embedded 
Mode
+@node Basic Embedded Mode
 @section Basic Embedded Mode
 
 @noindent
@@ -30733,7 +30733,7 @@ own Undo command (typed before you turn Embedded mode 
back off)
 will not do you any good, because as far as Calc is concerned
 you haven't done anything with this formula yet.
 
-@node More About Embedded Mode, Assignments in Embedded Mode, Basic Embedded 
Mode, Embedded Mode
+@node More About Embedded Mode
 @section More About Embedded Mode
 
 @noindent
@@ -30917,7 +30917,7 @@ embedded formula at the current point as if by @kbd{`} 
(@code{calc-edit}).
 Embedded mode does not have to be enabled for this to work.  Press
 @kbd{C-c C-c} to finish the edit, or @kbd{C-x k} to cancel.
 
-@node Assignments in Embedded Mode, Mode Settings in Embedded Mode, More About 
Embedded Mode, Embedded Mode
+@node Assignments in Embedded Mode
 @section Assignments in Embedded Mode
 
 @noindent
@@ -31143,7 +31143,7 @@ Operator}.  When you turn automatic recomputation back 
on, the
 stack will be updated but the Embedded buffer will not; you must
 use @kbd{C-x * u} to update the buffer by hand.
 
-@node Mode Settings in Embedded Mode, Customizing Embedded Mode, Assignments 
in Embedded Mode, Embedded Mode
+@node Mode Settings in Embedded Mode
 @section Mode Settings in Embedded Mode
 
 @kindex m e
@@ -31288,7 +31288,7 @@ annotations at all.
 When Embedded mode is not enabled, mode-recording modes except
 for @code{Save} have no effect.
 
-@node Customizing Embedded Mode,  , Mode Settings in Embedded Mode, Embedded 
Mode
+@node Customizing Embedded Mode
 @section Customizing Embedded Mode
 
 @noindent
@@ -31440,7 +31440,7 @@ is simply a newline, @code{"\n"}, but may be different 
for different
 major modes.  If you change this, it is a good idea still to end with a
 newline so that mode annotations will appear on lines by themselves.
 
-@node Programming, Copying, Embedded Mode, Top
+@node Programming
 @chapter Programming
 
 @noindent
@@ -31491,7 +31491,7 @@ described elsewhere; @pxref{User-Defined Compositions}.)
 * Lisp Definitions::
 @end menu
 
-@node Creating User Keys, Keyboard Macros, Programming, Programming
+@node Creating User Keys
 @section Creating User Keys
 
 @noindent
@@ -31566,7 +31566,7 @@ of a user key.  This works for keys that have been 
defined by either
 keyboard macros or formulas; further details are contained in the relevant
 following sections.
 
-@node Keyboard Macros, Invocation Macros, Creating User Keys, Programming
+@node Keyboard Macros
 @section Programming with Keyboard Macros
 
 @noindent
@@ -31609,7 +31609,7 @@ analogous to those provided by a traditional 
programmable calculator.
 * Queries in Macros::
 @end menu
 
-@node Naming Keyboard Macros, Conditionals in Macros, Keyboard Macros, 
Keyboard Macros
+@node Naming Keyboard Macros
 @subsection Naming Keyboard Macros
 
 @noindent
@@ -31659,7 +31659,7 @@ of spelled-out keystrokes and defines it as the current 
keyboard macro.
 It is a convenient way to define a keyboard macro that has been stored
 in a file, or to define a macro without executing it at the same time.
 
-@node Conditionals in Macros, Loops in Macros, Naming Keyboard Macros, 
Keyboard Macros
+@node Conditionals in Macros
 @subsection Conditionals in Keyboard Macros
 
 @noindent
@@ -31735,7 +31735,7 @@ If Calc gets stuck while skipping characters during the 
definition of a
 macro, type @kbd{Z C-g} to cancel the definition.  (Typing plain @kbd{C-g}
 actually adds a @kbd{C-g} keystroke to the macro.)
 
-@node Loops in Macros, Local Values in Macros, Conditionals in Macros, 
Keyboard Macros
+@node Loops in Macros
 @subsection Loops in Keyboard Macros
 
 @noindent
@@ -31828,7 +31828,7 @@ as easily as in a macro definition.
 @xref{Conditionals in Macros}, for some additional notes about
 conditional and looping commands.
 
-@node Local Values in Macros, Queries in Macros, Loops in Macros, Keyboard 
Macros
+@node Local Values in Macros
 @subsection Local Values in Macros
 
 @noindent
@@ -31893,7 +31893,7 @@ The contents of the stack and trail, values of 
non-quick variables, and
 other settings such as the language mode and the various display modes,
 are @emph{not} affected by @kbd{Z `} and @kbd{Z '}.
 
-@node Queries in Macros,  , Local Values in Macros, Keyboard Macros
+@node Queries in Macros
 @subsection Queries in Keyboard Macros
 
 @c @noindent
@@ -31933,7 +31933,7 @@ keyboard input during a keyboard macro.  In particular, 
you can use
 any Calculator operations interactively before pressing @kbd{C-M-c} to
 return control to the keyboard macro.
 
-@node Invocation Macros, Algebraic Definitions, Keyboard Macros, Programming
+@node Invocation Macros
 @section Invocation Macros
 
 @kindex C-x * z
@@ -31966,7 +31966,7 @@ The @kbd{m m} command saves the last invocation macro 
defined by
 @kbd{Z I} along with all the other Calc mode settings.
 @xref{General Mode Commands}.
 
-@node Algebraic Definitions, Lisp Definitions, Invocation Macros, Programming
+@node Algebraic Definitions
 @section Programming with Formulas
 
 @noindent
@@ -32078,7 +32078,7 @@ default simplifications cures this problem:  The 
definition will be stored
 in symbolic form without ever activating the @code{deriv} function.  Press
 @kbd{m D} to turn the default simplifications back on afterwards.
 
-@node Lisp Definitions,  , Algebraic Definitions, Programming
+@node Lisp Definitions
 @section Programming with Lisp
 
 @noindent
@@ -32114,7 +32114,7 @@ for the true Lisp enthusiast.
 * Internals::
 @end menu
 
-@node Defining Functions, Defining Simple Commands, Lisp Definitions, Lisp 
Definitions
+@node Defining Functions
 @subsection Defining New Functions
 
 @noindent
@@ -32335,7 +32335,7 @@ property are @code{defmath} calls, @code{define-key} 
calls that modify
 the Calc key map, and any calls that redefine things defined inside Calc.
 Ordinary @code{defun}s need not be enclosed with @code{calc-define}.
 
-@node Defining Simple Commands, Defining Stack Commands, Defining Functions, 
Lisp Definitions
+@node Defining Simple Commands
 @subsection Defining New Simple Commands
 
 @noindent
@@ -32497,7 +32497,7 @@ decreases the precision.
 (run-hooks 'calc-check-defines)
 @end smallexample
 
-@node Defining Stack Commands, Argument Qualifiers, Defining Simple Commands, 
Lisp Definitions
+@node Defining Stack Commands
 @subsection Defining New Stack-Based Commands
 
 @noindent
@@ -32599,7 +32599,7 @@ number of objects to remove from the stack and pass to 
the function.
 In this case, the integer @var{num} serves as a default number of
 arguments to be used when no prefix is supplied.
 
-@node Argument Qualifiers, Example Definitions, Defining Stack Commands, Lisp 
Definitions
+@node Argument Qualifiers
 @subsection Argument Qualifiers
 
 @noindent
@@ -32686,7 +32686,7 @@ expands to
 which performs the necessary checks and conversions before executing the
 body of the function.
 
-@node Example Definitions, Calling Calc from Your Programs, Argument 
Qualifiers, Lisp Definitions
+@node Example Definitions
 @subsection Example Definitions
 
 @noindent
@@ -32699,7 +32699,7 @@ These programs make use of some of the Calculator's 
internal functions;
 * Sine Example::
 @end menu
 
-@node Bit Counting Example, Sine Example, Example Definitions, Example 
Definitions
+@node Bit Counting Example
 @subsubsection Bit-Counting
 
 @noindent
@@ -32739,7 +32739,7 @@ Emacs Lisp function:
     count))
 @end smallexample
 
-@node Sine Example,  , Bit Counting Example, Example Definitions
+@node Sine Example
 @subsubsection The Sine Function
 
 @noindent
@@ -32823,7 +32823,7 @@ it carefully as shown in this second example.  For 
quick-and-dirty programs,
 when you know that your own use of the sine function will never encounter
 a large argument, a simpler program like the first one shown is fine.
 
-@node Calling Calc from Your Programs, Internals, Example Definitions, Lisp 
Definitions
+@node Calling Calc from Your Programs
 @subsection Calling Calc from Your Lisp Programs
 
 @noindent
@@ -33217,7 +33217,7 @@ Note the use of @code{insert-before-markers} when 
changing between
 ``F'' and ``C'', so that the character winds up before the cursor
 instead of after it.
 
-@node Internals,  , Calling Calc from Your Programs, Lisp Definitions
+@node Internals
 @subsection Calculator Internals
 
 @noindent
@@ -33257,7 +33257,7 @@ you can't prove this file will already be loaded.
 * Hooks::
 @end menu
 
-@node Data Type Formats, Interactive Lisp Functions, Internals, Internals
+@node Data Type Formats
 @subsubsection Data Type Formats
 
 @noindent
@@ -33377,7 +33377,7 @@ functions which are the outer-level call in an 
expression whose value is
 about to be pushed on the stack; this feature is considered obsolete
 and is not used by any built-in Calc functions.)
 
-@node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, 
Internals
+@node Interactive Lisp Functions
 @subsubsection Interactive Functions
 
 @noindent
@@ -33438,7 +33438,7 @@ i.e., if the Inverse (@kbd{I} key) flag was set.
 This predicate is the analogous function for the @kbd{H} key.
 @end defun
 
-@node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
+@node Stack Lisp Functions
 @subsubsection Stack-Oriented Functions
 
 @noindent
@@ -33625,7 +33625,7 @@ is suppressed, but a flag is set so that the entire 
stack will be refreshed
 rather than just the top few elements when the macro finishes.)
 @end defun
 
-@node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
+@node Predicates
 @subsubsection Predicates
 
 @noindent
@@ -33893,7 +33893,7 @@ This signals an error that will be reported as a 
floating-point overflow.
 This signals a floating-point underflow.
 @end defun
 
-@node Computational Lisp Functions, Vector Lisp Functions, Predicates, 
Internals
+@node Computational Lisp Functions
 @subsubsection Computational Functions
 
 @noindent
@@ -34233,7 +34233,7 @@ it returns 1 or 3.  If @var{n} is anything else, this 
function
 returns @code{nil}.
 @end defun
 
-@node Vector Lisp Functions, Symbolic Lisp Functions, Computational Lisp 
Functions, Internals
+@node Vector Lisp Functions
 @subsubsection Vector Functions
 
 @noindent
@@ -34370,7 +34370,7 @@ is true, with the side effect of exchanging the first 
two rows of
 @var{m}.
 @end defun
 
-@node Symbolic Lisp Functions, Formatting Lisp Functions, Vector Lisp 
Functions, Internals
+@node Symbolic Lisp Functions
 @subsubsection Symbolic Functions
 
 @noindent
@@ -34941,7 +34941,7 @@ Return a copy of @var{expr} with everything but units 
variables replaced
 by ones.
 @end defun
 
-@node Formatting Lisp Functions, Hooks, Symbolic Lisp Functions, Internals
+@node Formatting Lisp Functions
 @subsubsection I/O and Formatting Functions
 
 @noindent
@@ -35087,7 +35087,7 @@ If composition @var{c} is a ``flat'' composition, 
return the last
 @comment @noindent
 @comment (This section is currently unfinished.)
 
-@node Hooks,  , Formatting Lisp Functions, Internals
+@node Hooks
 @subsubsection Hooks
 
 @noindent
@@ -35242,15 +35242,15 @@ used the first time, your hook should add a variable 
to the
 list and also call @code{make-local-variable} itself.
 @end defvar
 
-@node Copying, GNU Free Documentation License, Programming, Top
+@node Copying
 @appendix GNU GENERAL PUBLIC LICENSE
 @include gpl.texi
 
-@node GNU Free Documentation License, Customizing Calc, Copying, Top
+@node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
-@node Customizing Calc, Reporting Bugs, GNU Free Documentation License, Top
+@node Customizing Calc
 @appendix Customizing Calc
 
 The usual prefix for Calc is the key sequence @kbd{C-x *}.  If you wish
@@ -35644,7 +35644,7 @@ choose from, or the user can enter their own date.
 The default value of @code{calc-gregorian-switch} is @code{nil}.
 @end defvar
 
-@node Reporting Bugs, Summary, Customizing Calc, Top
+@node Reporting Bugs
 @appendix Reporting Bugs
 
 @noindent
@@ -35669,7 +35669,7 @@ The latest version of Calc is available from Savannah, 
in the Emacs
 repository.  See @uref{https://savannah.gnu.org/projects/emacs}.
 
 @c [summary]
-@node Summary, Key Index, Reporting Bugs, Top
+@node Summary
 @appendix Calc Summary
 
 @noindent
@@ -36940,12 +36940,12 @@ grabs the @var{n}th mode value only.
 
 @c [end-summary]
 
-@node Key Index, Command Index, Summary, Top
+@node Key Index
 @unnumbered Index of Key Sequences
 
 @printindex ky
 
-@node Command Index, Function Index, Key Index, Top
+@node Command Index
 @unnumbered Index of Calculator Commands
 
 Since all Calculator commands begin with the prefix @samp{calc-}, the
@@ -36955,7 +36955,7 @@ types @samp{calc-} for you.  Thus, @kbd{x last-args} is 
short for
 
 @printindex pg
 
-@node Function Index, Concept Index, Command Index, Top
+@node Function Index
 @unnumbered Index of Algebraic Functions
 
 This is a list of built-in functions and operators usable in algebraic
@@ -36968,12 +36968,12 @@ Calc keystrokes and can also be found in the Calc 
Summary.
 
 @printindex tp
 
-@node Concept Index, Variable Index, Function Index, Top
+@node Concept Index
 @unnumbered Concept Index
 
 @printindex cp
 
-@node Variable Index, Lisp Function Index, Concept Index, Top
+@node Variable Index
 @unnumbered Index of Variables
 
 The variables in this list that do not contain dashes are accessible
@@ -36985,7 +36985,7 @@ in your Calc init file or @file{.emacs} file.
 
 @printindex vr
 
-@node Lisp Function Index,  , Variable Index, Top
+@node Lisp Function Index
 @unnumbered Index of Lisp Math Functions
 
 The following functions are meant to be used with @code{defmath}, not
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 24ab4b7..98ded68 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -219,10 +219,9 @@ or can be downloaded from 
@url{https://savannah.gnu.org/projects/emacs/}.
 @summarycontents
 @contents
 
-@node    Top, Introduction, (dir), (dir)
-@comment node-name, next, previous, up
 
 @ifnottex
+@node    Top
 @top @ccmode{}
 
 @ccmode{} is a GNU Emacs mode for editing files containing C, C++,
@@ -360,8 +359,7 @@ Custom Macros
 @end detailmenu
 @end menu
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Introduction, Overview, Top, Top
-@comment node-name, next, previous, up
+@node    Introduction
 @chapter Introduction
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -420,7 +418,7 @@ also like to thank all the @ccmode{} victims who help 
enormously
 during the early beta stages of @ccmode{}'s development.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Overview, Getting Started, Introduction, Top
+@node    Overview
 @comment  node-name,  next,  previous,  up@cindex organization of the manual
 @chapter Overview of the Manual
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -489,8 +487,7 @@ project: whether for updating @ccmode{} or submitting bug 
reports.
 Finally, there are the customary indices.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Getting Started, Commands, Overview, Top
-@comment node-name, next, previous, up
+@node    Getting Started
 @chapter Getting Started
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -601,8 +598,7 @@ where @samp{XX} is the minor release number.
 @end deffn
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Commands, Font Locking, Getting Started, Top
-@comment node-name, next, previous, up
+@node    Commands
 @chapter Commands
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -638,7 +634,7 @@ structures.
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Indentation Commands, Comment Commands, Commands, Commands
+@node    Indentation Commands
 @comment node-name, next, previous,up
 @section Indentation Commands
 @cindex indentation
@@ -817,8 +813,7 @@ often (in seconds) progress messages are to be displayed.
 @end defopt
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Comment Commands, Movement Commands, Indentation Commands, Commands
-@comment node-name, next, previous, up
+@node    Comment Commands
 @section Comment Commands
 @cindex comments (insertion of)
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -886,8 +881,7 @@ lines.
 @end table
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Movement Commands, Filling and Breaking, Comment Commands, Commands
-@comment node-name, next, previous, up
+@node    Movement Commands
 @section Movement Commands
 @cindex movement
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1042,7 +1036,7 @@ Movement}.  They might be removed from a future release 
of @ccmode{}.
 @end table
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Filling and Breaking, Minor Modes, Movement Commands, Commands
+@node    Filling and Breaking
 @comment  node-name,  next,  previous,  up
 @section Filling and Line Breaking Commands
 @cindex text filling
@@ -1136,8 +1130,7 @@ line break.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Minor Modes, Electric Keys, Filling and Breaking, Commands
-@comment node-name, next, previous, up
+@node    Minor Modes
 @section Minor Modes
 @cindex Minor Modes
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1257,8 +1250,7 @@ value will turn it (or them) off.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Electric Keys, Auto-newlines, Minor Modes, Commands
-@comment node-name, next, previous, up
+@node    Electric Keys
 @section Electric Keys and Keywords
 @cindex electric characters
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1437,8 +1429,7 @@ modes except IDL mode, since CORBA IDL doesn't have any 
statements.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Auto-newlines, Hungry WS Deletion, Electric Keys, Commands
-@comment node-name, next, previous, up
+@node    Auto-newlines
 @section Auto-newline Insertion
 @cindex auto-newline
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1493,8 +1484,7 @@ clean-ups listed by key.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Hungry WS Deletion, Subword Movement, Auto-newlines, Commands
-@comment node-name, next, previous, up
+@node    Hungry WS Deletion
 @section Hungry Deletion of Whitespace
 @cindex hungry-deletion
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1651,8 +1641,7 @@ trouble with this in GNU Emacs.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Subword Movement, Other Commands, Hungry WS Deletion, Commands
-@comment node-name, next, previous, up
+@node    Subword Movement
 @section Subword Movement and Editing
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -1744,8 +1733,7 @@ As a bonus, you can also use @code{subword-mode} in 
non-@ccmode{}
 buffers by typing @kbd{M-x subword-mode}.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Other Commands,  , Subword Movement, Commands
-@comment node-name, next, previous, up
+@node    Other Commands
 @section Other Commands
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -1842,8 +1830,7 @@ ask for help in the standard (X)Emacs forums.
 @end table
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Font Locking, Config Basics, Commands, Top
-@comment node-name, next, previous, up
+@node    Font Locking
 @chapter Font Locking
 @cindex font locking
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1874,8 +1861,7 @@ sections apply to the other languages.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Font Locking Preliminaries, Faces, Font Locking, Font Locking
-@comment node-name, next, previous, up
+@node    Font Locking Preliminaries
 @section Font Locking Preliminaries
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -1972,8 +1958,7 @@ recognize types.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Faces, Doc Comments, Font Locking Preliminaries, Font Locking
-@comment node-name, next, previous, up
+@node    Faces
 @section Faces
 @cindex faces
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2071,8 +2056,7 @@ since those aren't syntactic errors in themselves.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Doc Comments, Wrong Comment Style, Faces, Font Locking
-@comment node-name, next, previous, up
+@node    Doc Comments
 @section Documentation Comments
 @cindex documentation comments
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2156,7 +2140,7 @@ If you add support for another doc comment style, please 
consider
 contributing it: send a note to @email{bug-cc-mode@@gnu.org}.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Wrong Comment Style, Misc Font Locking, Doc Comments, Font Locking
+@node    Wrong Comment Style
 @comment  node-name,  next,  previous,  up
 @section Marking ``Wrong'' style comments
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2178,7 +2162,7 @@ which aren't of the default style will be fontified with
 @end defvar
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Misc Font Locking, AWK Mode Font Locking, Wrong Comment Style, Font 
Locking
+@node    Misc Font Locking
 @comment  node-name,  next,  previous,  up
 @section Miscellaneous Font Locking
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2233,7 +2217,7 @@ section only applies when CC Mode cannot disambiguate a 
construct in
 any other way.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    AWK Mode Font Locking,  , Misc Font Locking, Font Locking
+@node    AWK Mode Font Locking
 @comment  node-name,  next,  previous,  up
 @section AWK Mode Font Locking
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2294,7 +2278,7 @@ escaped newline.  The @samp{\} is highlighted.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Config Basics, Custom Filling and Breaking, Font Locking, Top
+@node    Config Basics
 @comment  node-name,  next,  previous,  up
 @chapter Configuration Basics
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2486,8 +2470,7 @@ have it enabled by default by placing the following in 
your
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    CC Hooks, Style Variables, Config Basics, Config Basics
-@comment node-name, next, previous, up
+@node    CC Hooks
 @section Hooks
 @cindex mode hooks
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2560,8 +2543,7 @@ file.
 @end example
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Style Variables, Styles, CC Hooks, Config Basics
-@comment node-name, next, previous, up
+@node    Style Variables
 @section Style Variables
 @cindex styles
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2648,8 +2630,7 @@ Commas});@*
 (@pxref{Custom Macros}).
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Styles,  , Style Variables, Config Basics
-@comment node-name, next, previous, up
+@node    Styles
 @section Styles
 @cindex styles
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2683,8 +2664,7 @@ already formatted piece of your code, @ref{Guessing the 
Style}.
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Built-in Styles, Choosing a Style, Styles, Styles
-@comment node-name, next, previous, up
+@node    Built-in Styles
 @subsection Built-in Styles
 @cindex styles, built-in
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2761,8 +2741,7 @@ afterwards.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Choosing a Style, Adding Styles, Built-in Styles, Styles
-@comment node-name, next, previous, up
+@node    Choosing a Style
 @subsection Choosing a Style
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -2819,8 +2798,7 @@ string.
 @end defvar
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Adding Styles, Guessing the Style, Choosing a Style, Styles
-@comment node-name, next, previous, up
+@node    Adding Styles
 @subsection Adding and Amending Styles
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -2907,8 +2885,7 @@ should not be changed directly; use @code{c-add-style} 
instead.
 @end defvar
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Guessing the Style, File Styles, Adding Styles, Styles
-@comment node-name, next, previous, up
+@node    Guessing the Style
 @subsection Guessing the Style
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -3030,8 +3007,7 @@ these offsets or the parent style name.
 @end table
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    File Styles,  , Guessing the Style, Styles
-@comment node-name, next, previous, up
+@node    File Styles
 @subsection File Styles
 @cindex styles, file local
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3079,8 +3055,7 @@ mode hooks (@pxref{CC Hooks}).  Any individual setting of 
a variable
 will override one made through @code{c-file-style} or
 @code{c-file-offsets}.
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Custom Filling and Breaking, Custom Auto-newlines, Config Basics, Top
-@comment node-name, next, previous, up
+@node    Custom Filling and Breaking
 @chapter Customizing Filling and Line Breaking
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -3298,8 +3273,7 @@ as one comment, and the rest of the paragraph handling 
code
 inconsistent behavior.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Custom Auto-newlines, Clean-ups, Custom Filling and Breaking, Top
-@comment node-name, next, previous, up
+@node    Custom Auto-newlines
 @chapter Customizing Auto-newlines
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -3354,8 +3328,7 @@ circumstances.  @xref{Clean-ups}.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Hanging Braces, Hanging Colons, Custom Auto-newlines, Custom 
Auto-newlines
-@comment node-name, next, previous, up
+@node    Hanging Braces
 @section Hanging Braces
 @cindex hanging braces
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3504,8 +3477,7 @@ themselves.
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Custom Braces,  , Hanging Braces, Hanging Braces
-@comment node-name, next, previous, up
+@node    Custom Braces
 @subsection Custom Brace Hanging
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -3592,8 +3564,7 @@ In all other cases, it returns the list @samp{(before 
after)} so
 that the brace appears on a line by itself.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Hanging Colons, Hanging Semicolons and Commas, Hanging Braces, Custom 
Auto-newlines
-@comment node-name, next, previous, up
+@node    Hanging Colons
 @section Hanging Colons
 @cindex hanging colons
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3635,8 +3606,7 @@ them are controlled by a different mechanism, called 
@dfn{clean-ups} in
 @ccmode{}.  @xref{Clean-ups}, for details.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Hanging Semicolons and Commas,  , Hanging Colons, Custom Auto-newlines
-@comment node-name, next, previous, up
+@node    Hanging Semicolons and Commas
 @section Hanging Semicolons and Commas
 @cindex hanging semicolons
 @cindex hanging commas
@@ -3715,8 +3685,7 @@ newlines after semicolons inside one-line inline method 
definitions
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Clean-ups, Indentation Engine Basics, Custom Auto-newlines, Top
-@comment node-name, next, previous, up
+@node    Clean-ups
 @chapter Clean-ups
 @cindex clean-ups
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3968,8 +3937,7 @@ situation if you just want a literal @samp{/} inserted.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Indentation Engine Basics, Customizing Indentation, Clean-ups, Top
-@comment node-name, next, previous, up
+@node    Indentation Engine Basics
 @chapter Indentation Engine Basics
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4028,8 +3996,7 @@ of the variables associated with indentation, not even
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Syntactic Analysis, Syntactic Symbols, Indentation Engine Basics, 
Indentation Engine Basics
-@comment node-name, next, previous, up
+@node    Syntactic Analysis
 @section Syntactic Analysis
 @cindex syntactic analysis
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4187,8 +4154,7 @@ anchor position.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Syntactic Symbols, Indentation Calculation, Syntactic Analysis, 
Indentation Engine Basics
-@comment node-name, next, previous, up
+@node    Syntactic Symbols
 @section Syntactic Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4435,8 +4401,7 @@ Java.  @ref{Java Symbols}.
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Function Symbols, Class Symbols, Syntactic Symbols, Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Function Symbols
 @subsection Function Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4478,8 +4443,7 @@ isn't much special about them.  Note however that line 8 
is given
 on the previous line.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Class Symbols, Conditional Construct Symbols, Function Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Class Symbols
 @subsection Class related Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4625,8 +4589,7 @@ Here, line 1 is analyzed as a @code{topmost-intro}, but 
lines 2 and 3
 are both analyzed as @code{template-args-cont} lines.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Conditional Construct Symbols, Switch Statement Symbols, Class 
Symbols, Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Conditional Construct Symbols
 @subsection Conditional Construct Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4693,8 +4656,7 @@ the same line as the preceding close brace, that line 
would still have
 @code{block-close} syntax.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Switch Statement Symbols, Brace List Symbols, Conditional Construct 
Symbols, Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Switch Statement Symbols
 @subsection Switch Statement Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4729,8 +4691,7 @@ is treated slightly differently since it contains a brace 
that opens a
 block; it is given @code{statement-case-open} syntax.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Brace List Symbols, External Scope Symbols, Switch Statement Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Brace List Symbols
 @subsection Brace List Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4796,8 +4757,7 @@ giving @code{brace-list-entry} an offset of
 @code{brace-list-entry} anchored on the @samp{1} of line 8.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    External Scope Symbols, Paren List Symbols, Brace List Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    External Scope Symbols
 @subsection External Scope Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4860,8 +4820,7 @@ that isn't the case for historical reasons.}
 @end table
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Paren List Symbols, Literal Symbols, External Scope Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Paren List Symbols
 @subsection Parenthesis (Argument) List Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -4920,8 +4879,7 @@ parenthesis that opens an argument list, appearing on a 
separate line,
 is assigned the @code{statement-cont} syntax instead.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Literal Symbols, Multiline Macro Symbols, Paren List Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Literal Symbols
 @subsection Comment String Label and Macro Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5009,8 +4967,7 @@ Line 17 is assigned @code{stream-op} syntax.
 @end itemize
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Multiline Macro Symbols, Objective-C Method Symbols, Literal Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Multiline Macro Symbols
 @subsection Multiline Macro Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5050,8 +5007,7 @@ macros.}.
 @xref{Custom Macros}, for more info about the treatment of macros.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Objective-C Method Symbols, Java Symbols, Multiline Macro Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Objective-C Method Symbols
 @subsection Objective-C Method Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5077,8 +5033,7 @@ assigned @code{objc-method-args-cont} syntax.  Lines 5 
and 6 are both
 assigned @code{objc-method-call-cont} syntax.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Java Symbols, Statement Block Symbols, Objective-C Method Symbols, 
Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Java Symbols
 @subsection Java Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5115,8 +5070,7 @@ syntax due to it being a continuation of a variable 
declaration where preceding
 the declaration is an annotation.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Statement Block Symbols, K&R Symbols, Java Symbols, Syntactic Symbols
-@comment node-name, next, previous, up
+@node    Statement Block Symbols
 @subsection Statement Block Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5194,8 +5148,7 @@ example above.  The other similar special function, 
@code{gauge}, is
 handled like this too.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    K&R Symbols,  , Statement Block Symbols, Syntactic Symbols
-@comment node-name, next, previous, up
+@node    K&R Symbols
 @subsection K&R Symbols
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5221,8 +5174,7 @@ syntax.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Indentation Calculation,  , Syntactic Symbols, Indentation Engine 
Basics
-@comment node-name, next, previous, up
+@node    Indentation Calculation
 @section Indentation Calculation
 @cindex indentation
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -5320,8 +5272,7 @@ minibuffer when you hit @kbd{TAB}.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Customizing Indentation, Custom Macros, Indentation Engine Basics, Top
-@comment node-name, next, previous, up
+@node    Customizing Indentation
 @chapter Customizing Indentation
 @cindex customization, indentation
 @cindex indentation
@@ -5367,8 +5318,7 @@ indentation.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    c-offsets-alist, Interactive Customization, Customizing Indentation, 
Customizing Indentation
-@comment node-name, next, previous, up
+@node    c-offsets-alist
 @section c-offsets-alist
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5536,8 +5486,7 @@ it doesn't work well with some of the alignment functions 
that return
 @code{c-strict-syntax-p} set to @code{nil}.}.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Interactive Customization, Line-Up Functions, c-offsets-alist, 
Customizing Indentation
-@comment node-name, next, previous, up
+@node    Interactive Customization
 @section Interactive Customization
 @cindex customization, interactive
 @cindex interactive customization
@@ -5644,8 +5593,7 @@ for that syntactic element.
 @c End of MOVE THIS BIT.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Line-Up Functions, Custom Line-Up, Interactive Customization, 
Customizing Indentation
-@comment node-name, next, previous, up
+@node    Line-Up Functions
 @section Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5718,8 +5666,7 @@ Works with:
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Brace/Paren Line-Up, List Line-Up, Line-Up Functions, Line-Up 
Functions
-@comment node-name, next, previous, up
+@node    Brace/Paren Line-Up
 @subsection Brace and Parenthesis Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -5975,8 +5922,7 @@ and @code{inextern-lang}.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    List Line-Up, Operator Line-Up, Brace/Paren Line-Up, Line-Up Functions
-@comment node-name, next, previous, up
+@node    List Line-Up
 @subsection List Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -6300,8 +6246,7 @@ the current line with the colon on the previous line.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Operator Line-Up, Comment Line-Up, List Line-Up, Line-Up Functions
-@comment node-name, next, previous, up
+@node    Operator Line-Up
 @subsection Operator Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -6468,8 +6413,7 @@ lineup functions.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Comment Line-Up, Misc Line-Up, Operator Line-Up, Line-Up Functions
-@comment node-name, next, previous, up
+@node    Comment Line-Up
 @subsection Comment Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -6578,8 +6522,7 @@ expressions.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Misc Line-Up,  , Comment Line-Up, Line-Up Functions
-@comment node-name, next, previous, up
+@node    Misc Line-Up
 @subsection Miscellaneous Line-Up Functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -6780,8 +6723,7 @@ the_larch,            @hereFn{c-lineup-topmost-intro-cont}
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Custom Line-Up, Other Indentation, Line-Up Functions, Customizing 
Indentation
-@comment node-name, next, previous, up
+@node    Custom Line-Up
 @section Custom Line-Up Functions
 @cindex customization, indentation functions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -6896,8 +6838,7 @@ any syntactic symbol that appears in 
@code{c-offsets-alist} can have a
 custom line-up function associated with it.
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Other Indentation,  , Custom Line-Up, Customizing Indentation
-@comment node-name, next, previous, up
+@node    Other Indentation
 @section Other Special Indentations
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -6948,8 +6889,7 @@ functions to this hook, not remove them.  @xref{Style 
Variables}.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Custom Macros, Odds and Ends, Customizing Indentation, Top
-@comment node-name, next, previous, up
+@node    Custom Macros
 @chapter Customizing Macros
 @cindex macros
 @cindex preprocessor directives
@@ -6997,7 +6937,7 @@ Macros}.
 @end menu
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node     Macro Backslashes, Macros with ;, Custom Macros, Custom Macros
+@node     Macro Backslashes
 @comment  node-name,  next,  previous,  up
 @section Customizing Macro Backslashes
 @cindex @code{#define}
@@ -7045,7 +6985,7 @@ get aligned only when you explicitly invoke the command
 @end defopt
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node Macros with ;, Noise Macros, Macro Backslashes, Custom Macros
+@node Macros with ;
 @comment  node-name,  next,  previous,  up
 @section Macros with semicolons
 @cindex macros with semicolons
@@ -7103,8 +7043,7 @@ initialization code, after the mode hooks have run.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Noise Macros, Indenting Directives, Macros with ;, Custom Macros
-@comment node-name, next, previous, up
+@node    Noise Macros
 @section Noise Macros
 @cindex noise macros
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -7160,8 +7099,7 @@ after the mode hooks have run.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Indenting Directives, , Noise Macros, Custom Macros
-@comment node-name, next, previous, up
+@node    Indenting Directives
 @section Indenting Directives
 @cindex Indenting Directives
 @cindex Indenting #pragma
@@ -7202,8 +7140,7 @@ depends on that variable.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Odds and Ends, Sample Init File, Custom Macros, Top
-@comment node-name, next, previous, up
+@node    Odds and Ends
 @chapter Odds and Ends
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7246,8 +7183,7 @@ anchoring position to indent the line in that case.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Sample Init File, Performance Issues, Odds and Ends, Top
-@comment node-name, next, previous, up
+@node    Sample Init File
 @appendix Sample Init File
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7305,8 +7241,7 @@ to change some of the actual values.
 @end verbatim
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Performance Issues, Limitations and Known Bugs, Sample Init File, Top
-@comment node-name, next, previous, up
+@node    Performance Issues
 @appendix Performance Issues
 @cindex performance
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -7414,8 +7349,7 @@ more info.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Limitations and Known Bugs, FAQ, Performance Issues, Top
-@comment node-name, next, previous, up
+@node    Limitations and Known Bugs
 @appendix Limitations and Known Bugs
 @cindex limitations
 @cindex bugs
@@ -7480,8 +7414,7 @@ early on:
 @end itemize
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    FAQ, Updating CC Mode, Limitations and Known Bugs, Top
-@comment node-name, next, previous, up
+@node    FAQ
 @appendix Frequently Asked Questions
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7609,8 +7542,7 @@ there since it's got its own system to keep track of 
blocks.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Updating CC Mode, Mailing Lists and Bug Reports, FAQ, Top
-@comment node-name, next, previous, up
+@node    Updating CC Mode
 @appendix Getting the Latest CC Mode Release
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7629,8 +7561,7 @@ compatibility, etc.@: are all available on the web site:
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Mailing Lists and Bug Reports, GNU Free Documentation License, 
Updating CC Mode, Top
-@comment node-name, next, previous, up
+@node    Mailing Lists and Bug Reports
 @appendix Mailing Lists and Submitting Bug Reports
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7673,15 +7604,14 @@ to the Usenet newsgroups @code{gnu.emacs.sources}, 
@code{comp.emacs},
 @c There is no newsgroup for Pike.  :-(
 
 
-@node GNU Free Documentation License, Command and Function Index, Mailing 
Lists and Bug Reports, Top
+@node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
 
 @c Removed the tentative node "Mode Initialization" from here, 2005/8/27.
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Command and Function Index, Variable Index, GNU Free Documentation 
License, Top
-@comment node-name, next, previous, up
+@node    Command and Function Index
 @unnumbered Command and Function Index
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7695,8 +7625,7 @@ Since most @ccmode{} commands are prepended with the 
string
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Variable Index, Concept and Key Index, Command and Function Index, Top
-@comment node-name, next, previous, up
+@node    Variable Index
 @unnumbered Variable Index
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -7710,8 +7639,7 @@ Since most @ccmode{} variables are prepended with the 
string
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-@node    Concept and Key Index,  , Variable Index, Top
-@comment node-name, next, previous, up
+@node    Concept and Key Index
 @unnumbered Concept and Key Index
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
diff --git a/doc/misc/ede.texi b/doc/misc/ede.texi
index a53f879..a0f316f 100644
--- a/doc/misc/ede.texi
+++ b/doc/misc/ede.texi
@@ -67,7 +67,7 @@ modify this GNU manual.''
 
 @contents
 
-@node Top, EDE Project Concepts, (dir), (dir)
+@node Top
 @top EDE
 @comment  node-name,  next,  previous,  up
 
@@ -95,7 +95,7 @@ learn and adopt GNU ways of doing things.
 * GNU Free Documentation License::  The license for this documentation.
 @end menu
 
-@node EDE Project Concepts, EDE Mode, Top, Top
+@node EDE Project Concepts
 @chapter @ede{} Project Concepts
 
 @ede{} is a generic interface for managing projects.  It specifies a
@@ -130,7 +130,7 @@ of search to files in a single target, or to discover the 
location of
 documentation or interface files.  @ede{} can provide this
 information.
 
-@node EDE Mode, Quick Start, EDE Project Concepts, Top
+@node EDE Mode
 @chapter @ede{} Mode
 
 @ede{} is implemented as a minor mode, which augments other modes such
@@ -147,7 +147,7 @@ bar.  This menu provides several menu items for high-level 
@ede{}
 commands.  These menu items, and their corresponding keybindings, are
 independent of the type of project you are actually working on.
 
-@node Quick Start, Creating a project, EDE Mode, Top
+@node Quick Start
 @chapter Quick Start
 
 Once you have @ede{} enabled, you can create a project.  This chapter
@@ -443,7 +443,7 @@ C-c . R @key{RET} @key{RET}
 If your program takes command line arguments, you can type them in
 when it offers the command line you want to use to run your program.
 
-@node Creating a project, Modifying your project, Quick Start, Top
+@node Creating a project
 @chapter Creating a project
 
 To create a new project, first visit a file that you want to include
@@ -488,7 +488,7 @@ the top-most project's makefile as a starting place for the 
build.  How
 the toplevel project handles subprojects in the build process is
 dependent on that project's type.
 
-@node Modifying your project, Building and Debugging, Creating a project, Top
+@node Modifying your project
 @chapter Modifying your project
 
 In this chapter, we describe the generic features for manipulating
@@ -504,7 +504,7 @@ detailed information about exactly what these features do.
 * EDE Project Features::
 @end menu
 
-@node Add/Remove target, Add/Remove files, Modifying your project, Modifying 
your project
+@node Add/Remove target
 @section Add/Remove target
 
 To create a new target, type @kbd{C-c . t} (@code{ede-new-target}) or
@@ -520,7 +520,7 @@ To remove a target from the project, type @kbd{M-x 
ede-delete-target},
 or use the @samp{Remove Target} menu item in the @samp{Project
 Options} submenu.
 
-@node Add/Remove files, Customize Features, Add/Remove target, Modifying your 
project
+@node Add/Remove files
 @section Add/Remove files
 
 To add the current file to an existing target, type @kbd{C-c . a}
@@ -541,7 +541,7 @@ not wish to add the file to any target, you can choose 
@samp{none}.
 You can customize this behavior with the variable
 @command{ede-auto-add-method}.
 
-@node Customize Features, Project Local Variables, Add/Remove files, Modifying 
your project
+@node Customize Features
 @section Customize Features
 
 A project, and its targets, are objects using the @samp{EIEIO} object
@@ -561,7 +561,7 @@ object, you can edit the file by typing @kbd{C-c . e}
 (@code{ede-edit-file-target}).  You should ``rescan'' the project
 afterwards (@pxref{Miscellaneous commands}).
 
-@node Project Local Variables, EDE Project Features, Customize Features, 
Modifying your project
+@node Project Local Variables
 @section Project Local Variables
 
 EDE projects can store and manager project local variables.  The
@@ -598,7 +598,7 @@ the format is an association list.  For example:
                          (compile-command . "make -f MyCustomMakefile all")))
 @end example
 
-@node EDE Project Features,  , Project Local Variables, Modifying your project
+@node EDE Project Features
 @section EDE Project Features
 
 This section details user facing features of an @ede{} @samp{Make}
@@ -618,7 +618,7 @@ additional details.
 * Configurations::
 @end menu
 
-@node Changing Compilers and Flags, Configurations, EDE Project Features, EDE 
Project Features
+@node Changing Compilers and Flags
 @subsection Changing Compilers and Flags
 
 Targets that build stuff need compilers.  To change compilers, you
@@ -638,7 +638,7 @@ see what commands are inserted.  Once you have determined 
the variable
 you need to modify, you can add a configuration for it.
 @xref{Configurations}.
 
-@node Configurations,  , Changing Compilers and Flags, EDE Project Features
+@node Configurations
 @subsection Configurations
 
 Configurations specify different ways to build a project.  For
@@ -658,7 +658,7 @@ block for ``configurations''.  Add a new named 
configuration here.
 To switch between different active configurations, modify the
 ``configuration default'' slot.
 
-@node Building and Debugging, Miscellaneous commands, Modifying your project, 
Top
+@node Building and Debugging
 @chapter Building and Debugging
 
 @ede{} provides the following ``project-aware'' compilation and
@@ -677,7 +677,7 @@ Build a distribution file for your project.
 
 These commands are also available from the @samp{Development} menu.
 
-@node Miscellaneous commands, Extending EDE, Building and Debugging, Top
+@node Miscellaneous commands
 @chapter Miscellaneous commands
 
 If you opt to go in and edit @ede{} project files directly---for
@@ -716,7 +716,7 @@ To activate the speedbar in this mode, type @kbd{C-c . s}
 * Simple projects::             Projects @ede{} doesn't manage.
 @end menu
 
-@node Make and Automake projects, Automake direct projects, Miscellaneous 
commands, Miscellaneous commands
+@node Make and Automake projects
 @section Make and Automake projects
 
 A project of @samp{ede-project} type creates a file called
@@ -728,7 +728,7 @@ in @samp{Makefile} mode, then this project will 
autogenerate a
 routines will also import and maintain a configure.am script and a
 host of other files required by Automake.
 
-@node Automake direct projects, Simple projects, Make and Automake projects, 
Miscellaneous commands
+@node Automake direct projects
 @section Automake direct projects
 
 The project type that reads @file{Makefile.am} directly is derived
@@ -738,7 +738,7 @@ distributed independently.  This mode eventually became 
@ede{}.  The
 not generate them automatically, or create new ones.  As such, it is
 useful as a browsing tool, or as maintenance in managing file lists.
 
-@node Simple projects,  , Automake direct projects, Miscellaneous commands
+@node Simple projects
 @section Simple Projects
 
 There is a wide array of simple projects.  In this case a simple
@@ -756,7 +756,7 @@ belonging to a project, but doesn't provide many features 
of a typical
 * Custom Locate::               Customizing how to locate files in a simple 
project
 @end menu
 
-@node ede-cpp-root, ede-emacs, Simple projects, Simple projects
+@node ede-cpp-root
 @subsection ede-cpp-root
 
 The @code{ede-cpp-root} project type allows you to create a single
@@ -897,7 +897,7 @@ of project.
 @xref{ede-cpp-root-project}, for details about the class that defines
 the @code{ede-cpp-root} project type.
 
-@node ede-emacs, ede-linux, ede-cpp-root, Simple projects
+@node ede-emacs
 @subsection ede-emacs
 
 The @code{ede-emacs} project automatically identifies an Emacs source
@@ -906,7 +906,7 @@ tree, and enables EDE project mode for it.
 It pre-populates the C Preprocessor symbol map for correct parsing,
 and has an optimized include file identification function.
 
-@node ede-linux, ede-generic-project, ede-emacs, Simple projects
+@node ede-linux
 @subsection ede-linux
 
 The @code{ede-linux} project will automatically identify a Linux
@@ -921,7 +921,7 @@ directory and its architecture, respectively.  The default 
is to assume that
 the build happens in the source directory and to auto-detect the
 architecture; if the auto-detection fails, you will be asked.
 
-@node ede-generic-project, Custom Locate, ede-linux, Simple projects
+@node ede-generic-project
 @subsection ede-generic-project
 
 The @code{ede-generic-project} is a project system that makes it easy
@@ -972,7 +972,7 @@ This example project will detect any directory with the file
 Customization of the project will allow you to make build and debug
 commands more precise.
 
-@node Custom Locate,  , ede-generic-project, Simple projects
+@node Custom Locate
 @subsection Custom Locate
 
 The various simple project styles all have one major drawback, which
@@ -1014,7 +1014,7 @@ simple example.
 More on idutils and cscope is in the CEDET manual, and they each have
 their own section.
 
-@node Extending EDE, GNU Free Documentation License, Miscellaneous commands, 
Top
+@node Extending EDE
 @chapter Extending @ede{}
 
 This chapter is intended for users who want to write new parts or fix
@@ -1069,7 +1069,7 @@ examples.
 * Compilers::                   Details of compiler classes.
 @end menu
 
-@node Development Overview, Detecting a Project, Extending EDE, Extending EDE
+@node Development Overview
 @section Development Overview
 
 @ede{} is made up of a series of classes implemented with @eieio{}.
@@ -1161,7 +1161,7 @@ Here is a high-level UML diagram for the @ede{} system 
created with @cogre{}..
 @end example
 
 
-@node Detecting a Project, User interface methods, Development Overview, 
Extending EDE
+@node Detecting a Project
 @section Detecting a Project
 
 Project detection happens with the list of @code{ede-project-autoload}
@@ -1226,7 +1226,7 @@ to the global list of all projects.  All subprojects are 
then created
 and assembled into the project data structures.
 
 
-@node User interface methods, Base project methods, Detecting a Project, 
Extending EDE
+@node User interface methods
 @section User interface methods
 
 These methods are core behaviors associated with user commands.
@@ -1258,7 +1258,7 @@ Make a distribution (tar archive) of the project.
 Rescan a project file, changing the data in the existing objects.
 @end table
 
-@node Base project methods, Sourcecode objects, User interface methods, 
Extending EDE
+@node Base project methods
 @section Base project methods
 
 These methods are important for querying base information from project
@@ -1296,7 +1296,7 @@ stored in.
 List all documentation a project or target is responsible for.
 @end table
 
-@node Sourcecode objects, Compiler and Linker objects, Base project methods, 
Extending EDE
+@node Sourcecode objects
 @section Sourcecode objects
 
 @ede{} projects track source file / target associates via source code
@@ -1342,7 +1342,7 @@ In this case, the garbage pattern is the same.
 
 @xref{Sourcecode}.
 
-@node Compiler and Linker objects, Project, Sourcecode objects, Extending EDE
+@node Compiler and Linker objects
 @section Compiler and Linker objects
 
 In order for a target to create a @file{Makefile}, it must know how to
@@ -1403,7 +1403,7 @@ See @file{ede-proj-obj.el} for examples of the 
combination.
 @defindex sc
 @defindex cm
 
-@node Project, Targets, Compiler and Linker objects, Extending EDE
+@node Project
 @section Project
 
 @menu
@@ -1417,7 +1417,7 @@ See @file{ede-proj-obj.el} for examples of the 
combination.
 * ede-step-project::
 @end menu
 
-@node ede-project-placeholder, ede-project, Project, Project
+@node ede-project-placeholder
 @subsection ede-project-placeholder
 @pjindex ede-project-placeholder
 
@@ -1503,7 +1503,7 @@ Make sure placeholder @var{THIS} is replaced with the 
real thing, and pass throu
 Make sure placeholder @var{THIS} is replaced with the real thing, and pass 
through.
 @end deffn
 
-@node ede-project, ede-cpp-root-project, ede-project-placeholder, Project
+@node ede-project
 @subsection ede-project
 @pjindex ede-project
 
@@ -1789,7 +1789,7 @@ Retrieves the slot @code{menu} from an object of class 
@code{ede-project}
 Commit change to local variables in @var{PROJ}.
 @end deffn
 
-@node ede-cpp-root-project, ede-simple-project, ede-project, Project
+@node ede-cpp-root-project
 @subsection ede-cpp-root-project
 @pjindex ede-cpp-root-project
 
@@ -1911,7 +1911,7 @@ Within this project @var{PROJ}, find the file @var{NAME}.
 This knows details about or source tree.
 @end deffn
 
-@node ede-simple-project, ede-simple-base-project, ede-cpp-root-project, 
Project
+@node ede-simple-project
 @subsection ede-simple-project
 @pjindex ede-simple-project
 
@@ -1941,7 +1941,7 @@ No children
 Commit any change to @var{PROJ} to its file.
 @end deffn
 
-@node ede-simple-base-project, ede-proj-project, ede-simple-project, Project
+@node ede-simple-base-project
 @subsection ede-simple-base-project
 @pjindex ede-simple-base-project
 
@@ -1971,7 +1971,7 @@ This one project could control a tree of subdirectories.
 @table @asis
 @end table
 
-@node ede-proj-project, project-am-makefile, ede-simple-base-project, Project
+@node ede-proj-project
 @subsection ede-proj-project
 @pjindex ede-proj-project
 
@@ -2161,7 +2161,7 @@ Return a list of files that constitutes a distribution of 
@var{THIS} project.
 Commit change to local variables in @var{PROJ}.
 @end deffn
 
-@node project-am-makefile, ede-step-project, ede-proj-project, Project
+@node project-am-makefile
 @subsection project-am-makefile
 @pjindex project-am-makefile
 
@@ -2203,7 +2203,7 @@ Despite the fact that this is a method, it depends on the 
current
 buffer being in order to provide a smart default target type.
 @end deffn
 
-@node ede-step-project,  , project-am-makefile, Project
+@node ede-step-project
 @subsection ede-step-project
 @pjindex ede-step-project
 
@@ -2328,7 +2328,7 @@ Return a list of files that constitutes a distribution of 
@var{THIS} project.
 Commit change to local variables in @var{PROJ}.
 @end deffn
 
-@node Targets, Sourcecode, Project, Extending EDE
+@node Targets
 @section Targets
 
 @menu
@@ -2356,7 +2356,7 @@ Commit change to local variables in @var{PROJ}.
 @end menu
 
 
-@node ede-target, ede-proj-target, Targets, Targets
+@node ede-target
 @subsection ede-target
 @tgindex ede-target
 
@@ -2565,7 +2565,7 @@ Return the name of @var{THIS} target, suitable for make 
or debug style commands.
 Retrieves the slot @code{menu} from an object of class @code{ede-target}
 @end deffn
 
-@node ede-proj-target, ede-proj-target-makefile, ede-target, Targets
+@node ede-proj-target
 @subsection ede-proj-target
 @tgindex ede-proj-target
 
@@ -2754,7 +2754,7 @@ sources variable.
 @end deffn
 
 
-@node ede-proj-target-makefile, semantic-ede-proj-target-grammar, 
ede-proj-target, Targets
+@node ede-proj-target-makefile
 @subsection ede-proj-target-makefile
 @tgindex ede-proj-target-makefile
 
@@ -2852,7 +2852,7 @@ Return a list of configuration variables from @var{THIS}.
 Use @var{CONFIGURATION} as the current configuration to query.
 @end deffn
 
-@node semantic-ede-proj-target-grammar, ede-proj-target-makefile-objectcode, 
ede-proj-target-makefile, Targets
+@node semantic-ede-proj-target-grammar
 @subsection semantic-ede-proj-target-grammar
 @tgindex semantic-ede-proj-target-grammar
 
@@ -2906,7 +2906,7 @@ Argument @var{THIS} is the target that should insert 
stuff.
 @end deffn
 
 
-@node ede-proj-target-makefile-objectcode, ede-proj-target-makefile-archive, 
semantic-ede-proj-target-grammar, Targets
+@node ede-proj-target-makefile-objectcode
 @subsection ede-proj-target-makefile-objectcode
 @tgindex ede-proj-target-makefile-objectcode
 
@@ -2968,7 +2968,7 @@ Argument @var{THIS} is the target to get sources from.
 @end deffn
 
 
-@node ede-proj-target-makefile-archive, ede-proj-target-makefile-program, 
ede-proj-target-makefile-objectcode, Targets
+@node ede-proj-target-makefile-archive
 @subsection ede-proj-target-makefile-archive
 @tgindex ede-proj-target-makefile-archive
 
@@ -3011,7 +3011,7 @@ Makefile.am generator, so use it to add this important 
bin program.
 @end deffn
 
 
-@node ede-proj-target-makefile-program, 
ede-proj-target-makefile-shared-object, ede-proj-target-makefile-archive, 
Targets
+@node ede-proj-target-makefile-program
 @subsection ede-proj-target-makefile-program
 @tgindex ede-proj-target-makefile-program
 
@@ -3090,7 +3090,7 @@ Insert bin_PROGRAMS variables needed by target @var{THIS}.
 @end deffn
 
 
-@node ede-proj-target-makefile-shared-object, ede-proj-target-elisp, 
ede-proj-target-makefile-program, Targets
+@node ede-proj-target-makefile-shared-object
 @subsection ede-proj-target-makefile-shared-object
 @tgindex ede-proj-target-makefile-shared-object
 
@@ -3150,7 +3150,7 @@ Makefile.am generator, so use it to add this important 
bin program.
 @end deffn
 
 
-@node ede-proj-target-elisp, ede-proj-target-elisp-autoloads, 
ede-proj-target-makefile-shared-object, Targets
+@node ede-proj-target-elisp
 @subsection ede-proj-target-elisp
 @tgindex ede-proj-target-elisp
 
@@ -3226,7 +3226,7 @@ There are standards in Elisp files specifying how the 
version string
 is found, such as a @code{-version} variable, or the standard header.
 @end deffn
 
-@node ede-proj-target-elisp-autoloads, ede-proj-target-makefile-miscelaneous, 
ede-proj-target-elisp, Targets
+@node ede-proj-target-elisp-autoloads
 @subsection ede-proj-target-elisp-autoloads
 @tgindex ede-proj-target-elisp-autoloads
 
@@ -3341,7 +3341,7 @@ sources variable.
 @end deffn
 
 
-@node ede-proj-target-makefile-miscelaneous, ede-proj-target-makefile-info, 
ede-proj-target-elisp-autoloads, Targets
+@node ede-proj-target-makefile-miscelaneous
 @subsection ede-proj-target-makefile-miscelaneous
 @tgindex ede-proj-target-makefile-miscelaneous
 
@@ -3397,7 +3397,7 @@ Return a list of files which @var{THIS} target depends on.
 @end deffn
 
 
-@node ede-proj-target-makefile-info, ede-proj-target-scheme, 
ede-proj-target-makefile-miscelaneous, Targets
+@node ede-proj-target-makefile-info
 @subsection ede-proj-target-makefile-info
 @tgindex ede-proj-target-makefile-info
 
@@ -3483,7 +3483,7 @@ Does the usual for Makefile mode, but splits source into 
two variables
 when working in Automake mode.
 @end deffn
 
-@node ede-proj-target-scheme, project-am-target, 
ede-proj-target-makefile-info, Targets
+@node ede-proj-target-scheme
 @subsection ede-proj-target-scheme
 @tgindex ede-proj-target-scheme
 
@@ -3527,7 +3527,7 @@ Tweak the configure file (current buffer) to accommodate 
@var{THIS}.
 @end deffn
 
 
-@node project-am-target, project-am-objectcode, ede-proj-target-scheme, Targets
+@node project-am-target
 @subsection project-am-target
 @tgindex project-am-target
 
@@ -3565,7 +3565,7 @@ Run the current project in the debugger.
 Edit the target associated w/ this file.
 @end deffn
 
-@node project-am-objectcode, project-am-program, project-am-target, Targets
+@node project-am-objectcode
 @subsection project-am-objectcode
 @tgindex project-am-objectcode
 
@@ -3610,7 +3610,7 @@ Default target to use when compiling an object code 
target.
 There are no default header files.
 @end deffn
 
-@node project-am-program, project-am-header-noinst, project-am-objectcode, 
Targets
+@node project-am-program
 @subsection project-am-program
 @tgindex project-am-program
 
@@ -3648,7 +3648,7 @@ Additional LD args.
 @end table
 @end table
 
-@node project-am-header-noinst, project-am-header-inst, project-am-program, 
Targets
+@node project-am-header-noinst
 @subsection project-am-header-noinst
 @tgindex project-am-header-noinst
 
@@ -3681,7 +3681,7 @@ No children
 Return the default macro to 'edit' for this object.
 @end deffn
 
-@node project-am-header-inst, project-am-lisp, project-am-header-noinst, 
Targets
+@node project-am-header-inst
 @subsection project-am-header-inst
 @tgindex project-am-header-inst
 
@@ -3714,7 +3714,7 @@ No children
 Return the default macro to 'edit' for this object.
 @end deffn
 
-@node project-am-lisp, project-am-texinfo, project-am-header-inst, Targets
+@node project-am-lisp
 @subsection project-am-lisp
 @tgindex project-am-lisp
 
@@ -3744,7 +3744,7 @@ No children
 Return the default macro to 'edit' for this object.
 @end deffn
 
-@node project-am-texinfo, project-am-man, project-am-lisp, Targets
+@node project-am-texinfo
 @subsection project-am-texinfo
 @tgindex project-am-texinfo
 
@@ -3795,7 +3795,7 @@ Documentation is not for object @var{THIS}, but is 
provided by @var{THIS} for ot
 files in the project.
 @end deffn
 
-@node project-am-man,  , project-am-texinfo, Targets
+@node project-am-man
 @comment  node-name,  next,  previous,  up
 @subsection project-am-man
 @tgindex project-am-man
@@ -3826,7 +3826,7 @@ No children
 Return the default macro to 'edit' for this object type.
 @end deffn
 
-@node Sourcecode, Compilers, Targets, Extending EDE
+@node Sourcecode
 @section Sourcecode
 
 The source code type is an object designed to associated files with
@@ -3837,7 +3837,7 @@ targets.
 @end menu
 
 
-@node ede-sourcecode,  , Sourcecode, Sourcecode
+@node ede-sourcecode
 @subsection ede-sourcecode
 @scindex ede-sourcecode
 
@@ -3934,7 +3934,7 @@ Return non-@code{nil} if @var{THIS} will take 
@var{FILENAME} as an auxiliary .
 Return non-@code{nil} if @var{THIS} will take @var{FILENAME} as an auxiliary .
 @end deffn
 
-@node Compilers,  , Sourcecode, Extending EDE
+@node Compilers
 @section Compilers
 
 The compiler object is designed to associate source code with
@@ -3950,7 +3950,7 @@ compile commands.
 @end menu
 
 
-@node ede-compilation-program, ede-compiler, Compilers, Compilers
+@node ede-compilation-program
 @subsection ede-compilation-program
 @cmindex ede-compilation-program
 
@@ -4061,7 +4061,7 @@ Tweak the configure file (current buffer) to accommodate 
@var{THIS}.
 @end deffn
 
 
-@node ede-compiler, ede-object-compiler, ede-compilation-program, Compilers
+@node ede-compiler
 @subsection ede-compiler
 @cmindex ede-compiler
 
@@ -4169,7 +4169,7 @@ Return a string based on @var{THIS} representing a make 
object variable.
 @end deffn
 
 
-@node ede-object-compiler, ede-linker, ede-compiler, Compilers
+@node ede-object-compiler
 @subsection ede-object-compiler
 @cmindex ede-object-compiler
 
@@ -4212,7 +4212,7 @@ A variable dedicated to dependency generation.
 Insert variables needed by the compiler @var{THIS}.
 @end deffn
 
-@node ede-linker,  , ede-object-compiler, Compilers
+@node ede-linker
 @subsection ede-linker
 @cmindex ede-linker
 
@@ -4274,7 +4274,7 @@ For example, C code uses .o on unix, and Emacs Lisp uses 
.elc.
 @end table
 @end table
 
-@node GNU Free Documentation License,  , Extending EDE, Top
+@node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
diff --git a/doc/misc/eieio.texi b/doc/misc/eieio.texi
index 4952e90..63b4282 100644
--- a/doc/misc/eieio.texi
+++ b/doc/misc/eieio.texi
@@ -115,10 +115,10 @@ Each class can have methods, which are defined like this:
 (cl-defmethod call-person ((pers person) &optional scriptname)
   "Dial the phone for the person PERS.
 Execute the program SCRIPTNAME to dial the phone."
-  (message "Dialing the phone for %s"  (oref pers name))
+  (message "Dialing the phone for %s"  (slot-value pers 'name))
   (shell-command (concat (or scriptname "dialphone.sh")
                          " "
-                         (oref pers phone))))
+                         (slot-value pers 'phone))))
 @end example
 
 @noindent
@@ -693,16 +693,43 @@ for each slot.  For example:
 @node Accessing Slots
 @chapter Accessing Slots
 
-There are several ways to access slot values in an object.  The naming
-and argument-order conventions are similar to those used for
-referencing vectors (@pxref{Vectors,,,elisp,GNU Emacs Lisp Reference
-Manual}).
+There are several ways to access slot values in an object.
+The following accessors are defined by CLOS to reference or modify
+slot values, and use the previously mentioned set/ref routines.
+
+@defun slot-value object slot
+@anchor{slot-value}
+This function retrieves the value of @var{slot} from @var{object}.
+
+This is a generalized variable that can be used with @code{setf} to
+modify the value stored in @var{slot}.  @xref{Generalized
+Variables,,,elisp,GNU Emacs Lisp Reference Manual}.
+@end defun
+
+@defun set-slot-value object slot value
+@anchor{set-slot-value}
+This function sets the value of @var{slot} from @var{object}.
+
+This is not a CLOS function, but is the obsolete setter for
+@code{slot-value} used by the @code{setf} macro.  It is therefore
+recommended to use @w{@code{(setf (slot-value @var{object} @var{slot})
+@var{value})}} instead.
+@end defun
+
+@defun slot-makeunbound object slot
+This function unbinds @var{slot} in @var{object}.  Referencing an
+unbound slot can signal an error.
+@end defun
+
+The following accessors follow a naming and argument-order conventions
+are similar to those used for referencing vectors
+(@pxref{Vectors,,,elisp,GNU Emacs Lisp Reference Manual}).
 
 @defmac oref obj slot
 @anchor{oref}
 This macro retrieves the value stored in @var{obj} in the named
-@var{slot}.  Slot names are determined by @code{defclass} which
-creates the slot.
+@var{slot}.  Unlike @code{slot-value}, the symbol for @var{slot} must
+not be quoted.
 
 This is a generalized variable that can be used with @code{setf} to
 modify the value stored in @var{slot}.  @xref{Generalized
@@ -737,35 +764,6 @@ changed, this can be arranged by simply executing this bit 
of code:
 @end example
 @end defmac
 
-The following accessors are defined by CLOS to reference or modify
-slot values, and use the previously mentioned set/ref routines.
-
-@defun slot-value object slot
-@anchor{slot-value}
-This function retrieves the value of @var{slot} from @var{object}.
-Unlike @code{oref}, the symbol for @var{slot} must be quoted.
-
-This is a generalized variable that can be used with @code{setf} to
-modify the value stored in @var{slot}.  @xref{Generalized
-Variables,,,elisp,GNU Emacs Lisp Reference Manual}.
-@end defun
-
-@defun set-slot-value object slot value
-@anchor{set-slot-value}
-This function sets the value of @var{slot} from @var{object}.  Unlike
-@code{oset}, the symbol for @var{slot} must be quoted.
-
-This is not a CLOS function, but is the obsolete setter for
-@code{slot-value} used by the @code{setf} macro.  It is therefore
-recommended to use @w{@code{(setf (slot-value @var{object} @var{slot})
-@var{value})}} instead.
-@end defun
-
-@defun slot-makeunbound object slot
-This function unbinds @var{slot} in @var{object}.  Referencing an
-unbound slot can signal an error.
-@end defun
-
 @defun object-add-to-list object slot item &optional append
 @anchor{object-add-to-list}
 In OBJECT's @var{slot}, add @var{item} to the list of elements.
@@ -807,7 +805,7 @@ Where each @var{var} is the local variable given to the 
associated
 variable name of the same name as the slot.
 
 @example
-(defclass myclass () (x :initform 1))
+(defclass myclass () ((x :initform 1)))
 (setq mc (make-instance 'myclass))
 (with-slots (x) mc x)                      => 1
 (with-slots ((something x)) mc something)  => 1
@@ -981,8 +979,8 @@ the @code{subclass} specializer with @code{cl-defmethod}:
     new))
 @end example
 
-The first argument of a static method will be a class rather than an
-object.  Use the functions @code{oref-default} or @code{oset-default} which
+The argument of a static method will be a class rather than an object.
+Use the functions @code{oref-default} or @code{oset-default} which
 will work on a class.
 
 A class's @code{make-instance} method is defined as a static
@@ -1238,12 +1236,6 @@ of CLOS.
 Return the list of public slots for @var{obj}.
 @end defun
 
-@defun class-slot-initarg class slot
-For the given @var{class} return an :initarg associated with
-@var{slot}.  Not all slots have initargs, so the return value can be
-@code{nil}.
-@end defun
-
 @node Base Classes
 @chapter Base Classes
 
@@ -1656,8 +1648,8 @@ Method invoked when an attempt to access a slot in 
@var{object} fails.
 that was requested, and optional @var{new-value} is the value that was desired
 to be set.
 
-This method is called from @code{oref}, @code{oset}, and other functions which
-directly reference slots in EIEIO objects.
+This method is called from @code{slot-value}, @code{set-slot-value},
+and other functions which directly reference slots in EIEIO objects.
 
 The default method signals an error of type @code{invalid-slot-name}.
 @xref{Signals}.
diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi
index 0cf5ba9..7cd3e5f 100644
--- a/doc/misc/emacs-mime.texi
+++ b/doc/misc/emacs-mime.texi
@@ -1870,6 +1870,11 @@ A customizable list of viewers that take preference over
 Interface functions:
 
 @table @code
+@item mailcap-view-file
+@findex mailcap-view-file
+Prompt for a file name, and start a viewer applicable for the file
+type in question.
+
 @item mailcap-parse-mailcaps
 @findex mailcap-parse-mailcaps
 @vindex mailcap-prefer-mailcap-viewers
diff --git a/doc/misc/epa.texi b/doc/misc/epa.texi
index cca0d30..e777771 100644
--- a/doc/misc/epa.texi
+++ b/doc/misc/epa.texi
@@ -42,7 +42,7 @@ modify this GNU manual.''
 
 @contents
 
-@node Top, Overview, (dir), (dir)
+@node Top
 @top EasyPG Assistant user's manual
 
 EasyPG Assistant is an Emacs user interface to GNU Privacy Guard
@@ -60,8 +60,8 @@ called EasyPG Library.
 * Overview::
 * Quick start::
 * Commands::
-* Caching Passphrases::
 * GnuPG version compatibility::
+* Caching Passphrases::
 * Bug Reports::
 * GNU Free Documentation License::  The license for this documentation.
 * Key Index::
@@ -69,7 +69,7 @@ called EasyPG Library.
 * Variable Index::
 @end menu
 
-@node  Overview, Quick start, Top, Top
+@node Overview
 @chapter Overview
 
 EasyPG Assistant provides the following features.
@@ -83,7 +83,7 @@ EasyPG Assistant provides the following features.
 @item Automatic encryption/decryption of *.gpg files.
 @end itemize
 
-@node  Quick start, Commands, Overview, Top
+@node Quick start
 @chapter Quick start
 
 EasyPG Assistant commands are prefixed by @samp{epa-}.  For example,
@@ -94,13 +94,15 @@ EasyPG Assistant commands are prefixed by @samp{epa-}.  For 
example,
 @item To create a cleartext signature of the region, type @kbd{M-x 
epa-sign-region}
 
 @item To encrypt a file, type @kbd{M-x epa-encrypt-file}
+
+@item To query a key server for keys, type @kbd{M-x epa-search-keys}
 @end itemize
 
 EasyPG Assistant provides several cryptographic features which can be
 integrated into other Emacs functionalities.  For example, automatic
 encryption/decryption of @file{*.gpg} files.
 
-@node Commands, GnuPG version compatibility, Quick start, Top
+@node Commands
 @chapter Commands
 
 This chapter introduces various commands for typical use cases.
@@ -112,9 +114,10 @@ This chapter introduces various commands for typical use 
cases.
 * Dired integration::
 * Mail-mode integration::
 * Encrypting/decrypting gpg files::
+* Querying a key server::
 @end menu
 
-@node Key management, Cryptographic operations on regions, Commands, Commands
+@node Key management
 @section Key management
 Probably the first step of using EasyPG Assistant is to browse your
 keyring.  @kbd{M-x epa-list-keys} is corresponding to @samp{gpg
@@ -197,7 +200,7 @@ Delete selected keys.  If @var{allow-secret} is 
non-@code{nil}, it
 also delete the secret keys.
 @end deffn
 
-@node Cryptographic operations on regions, Cryptographic operations on files, 
Key management, Commands
+@node Cryptographic operations on regions
 @section Cryptographic operations on regions
 
 @deffn Command epa-decrypt-region start end
@@ -242,7 +245,7 @@ also ask you whether or not to sign the text before 
encryption and if
 you answered yes, it will let you select the signing keys.
 @end deffn
 
-@node Cryptographic operations on files, Dired integration, Cryptographic 
operations on regions, Commands
+@node Cryptographic operations on files
 @section Cryptographic operations on files
 
 @deffn Command epa-decrypt-file file &optional output
@@ -263,7 +266,7 @@ select signing keys, and then a signature type.
 Encrypt @var{file}.  It will let you select recipients.
 @end deffn
 
-@node Dired integration, Mail-mode integration, Cryptographic operations on 
files, Commands
+@node Dired integration
 @section Dired integration
 
 EasyPG Assistant extends Dired Mode for GNU Emacs to allow users to
@@ -302,7 +305,7 @@ Encrypt marked files.
 
 @end table
 
-@node Mail-mode integration, Encrypting/decrypting gpg files, Dired 
integration, Commands
+@node Mail-mode integration
 @section Mail-mode integration
 
 EasyPG Assistant provides a minor mode @code{epa-mail-mode} to help
@@ -357,7 +360,7 @@ With prefix argument, asks you to select the recipients 
interactively,
 whether to sign, and which key(s) to sign with.
 @end table
 
-@node Encrypting/decrypting gpg files,  , Mail-mode integration, Commands
+@node Encrypting/decrypting gpg files
 @section Encrypting/decrypting gpg files
 By default, every file whose name ends with @file{.gpg} will be
 treated as encrypted.  That is, when you open such a file, the
@@ -440,7 +443,22 @@ If non-@code{nil}, disable auto-saving when opening an 
encrypted file.
 The default value is @code{t}.
 @end defvar
 
-@node GnuPG version compatibility, Caching Passphrases, Commands, Top
+@node Querying a key server
+@section Querying a key server
+
+The @code{epa-search-keys} command can be used to query a
+@acronym{GPG} key server.  Emacs will then pop up a buffer that lists
+the matches, and you can then fetch (and add) keys to your personal
+key ring.
+
+In the key search buffer, you can use the @kbd{f} command to mark keys
+for fetching, and then @kbd{x} to fetch the keys (and incorporate them
+into your key ring).
+
+The @code{epa-keyserver} variable says which server to query.
+
+
+@node GnuPG version compatibility
 @chapter GnuPG version compatibility
 
 As of February 2016, there are three active branches of GnuPG: 2.1,
@@ -472,7 +490,7 @@ specifically, with 2.0 (as of 2.0.29), there is no way to 
avoid the
 graphical prompt.
 @end itemize
 
-@node Caching Passphrases, Bug Reports, GnuPG version compatibility, Top
+@node Caching Passphrases
 @chapter Caching Passphrases
 
 Typing passphrases is a troublesome task if you frequently open and
@@ -512,7 +530,7 @@ To set up elisp passphrase cache, set
 @code{epa-file-cache-passphrase-for-symmetric-encryption}.
 @xref{Encrypting/decrypting gpg files}.
 
-@node Bug Reports, GNU Free Documentation License, Caching Passphrases, Top
+@node Bug Reports
 @chapter Bug Reports
 
 Bugs and problems with EasyPG Assistant are actively worked on by the
@@ -534,19 +552,19 @@ Before reporting the bug, you should set @code{epg-debug} 
in the
 of the @file{ *epg-debug*} buffer.  Note that the first letter of the
 buffer name is a whitespace.
 
-@node GNU Free Documentation License, Key Index, Bug Reports, Top
+@node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
-@node Key Index, Function Index, GNU Free Documentation License, Top
+@node Key Index
 @unnumbered Key Index
 @printindex ky
 
-@node Function Index, Variable Index, Key Index, Top
+@node Function Index
 @unnumbered Function Index
 @printindex fn
 
-@node Variable Index,  , Function Index, Top
+@node Variable Index
 @unnumbered Variable Index
 @printindex vr
 
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index 45a753d..77a19a4 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -518,7 +518,7 @@ That is, if called with the following arguments, 
@var{server} and
 for the values of the other parameters.
 
 @example
-(erc :server "chat.freenode.net" :full-name "Harry S Truman")
+(erc :server "chat.freenode.net" :full-name "J. Random Hacker")
 @end example
 @end defun
 
@@ -545,7 +545,7 @@ for the values of the other parameters, and 
@code{client-certificate}
 will be @code{nil}.
 
 @example
-(erc-tls :server "chat.freenode.net" :full-name "Harry S Truman")
+(erc-tls :server "chat.freenode.net" :full-name "J. Random Hacker")
 @end example
 
 To use a certificate with @code{erc-tls}, specify the optional
@@ -557,7 +557,7 @@ and the second element is the file name of the client 
certificate
 itself to use when connecting over TLS, or @code{t}, which means that
 @code{auth-source} will be queried for the private key and the
 certificate.  Authenticating using a TLS client certificate is also
-refered to as ``CertFP'' (Certificate Fingerprint) authentication by
+referred to as ``CertFP'' (Certificate Fingerprint) authentication by
 various IRC networks.
 
 Examples of use:
@@ -588,6 +588,9 @@ line like the following to your authinfo file
 @example
 machine chat.freenode.net key /home/bandali/my-cert.key cert 
/home/bandali/my-cert.crt
 @end example
+
+@xref{Help for users,,,auth, Emacs auth-source Library}, for more on the
+@file{.authinfo}/@file{.netrc} backend of @code{auth-source}.
 @end defun
 
 @subheading Server
diff --git a/doc/misc/ert.texi b/doc/misc/ert.texi
index a4e2cb5..fafdb8c 100644
--- a/doc/misc/ert.texi
+++ b/doc/misc/ert.texi
@@ -347,6 +347,10 @@ emacs -batch -l ert -l my-tests.el \
       -eval '(ert-run-tests-batch-and-exit "to-match")'
 @end example
 
+By default, ERT test failure summaries are quite brief in batch
+mode--only the names of the failed tests are listed.  If the
+EMACS_TEST_VERBOSE environment variable is set, the failure summaries
+will also include the data from the failing test.
 
 @node Test Selectors
 @section Test Selectors
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 869bb27..c9b5b2d 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -2583,25 +2583,28 @@ with the process mark and then execute the command.
 @itemx M m
 @kindex M m @r{(Group)}
 @findex gnus-group-mark-group
-Set the mark on the current group (@code{gnus-group-mark-group}).
+Toggle the process mark for the current group
+(@code{gnus-group-mark-group}).@*
+If @code{gnus-process-mark-toggle} is @code{nil}, set the process mark
+for the current group.
 
 @item M-#
 @kindex M-# @r{(Group)}
 @itemx M u
 @kindex M u @r{(Group)}
 @findex gnus-group-unmark-group
-Remove the mark from the current group
+Remove the process mark, if any, from the current group
 (@code{gnus-group-unmark-group}).
 
 @item M U
 @kindex M U @r{(Group)}
 @findex gnus-group-unmark-all-groups
-Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
+Remove the process mark from all groups (@code{gnus-group-unmark-all-groups}).
 
 @item M w
 @kindex M w @r{(Group)}
 @findex gnus-group-mark-region
-Mark all groups between point and mark (@code{gnus-group-mark-region}).
+Mark groups in region (@code{gnus-group-mark-region}).
 
 @item M b
 @kindex M b @r{(Group)}
@@ -4041,9 +4044,11 @@ Toggle hiding empty topics
 @item T #
 @kindex T # @r{(Topic)}
 @findex gnus-topic-mark-topic
-Mark all groups in the current topic with the process mark
+Toggle the process mark for all groups in the current topic
 (@code{gnus-topic-mark-topic}).  This command works recursively on
-sub-topics unless given a prefix.
+sub-topics unless given a prefix.@*
+If @code{gnus-process-mark-toggle} is @code{nil}, set the process mark
+for the current topic.
 
 @item T M-#
 @kindex T M-# @r{(Topic)}
@@ -4121,6 +4126,8 @@ Visibility.
 Level.
 @item g
 Number of groups in the topic.
+@item G
+Number of groups in the topic and all its subtopics.
 @item a
 Number of unread articles in the topic.
 @item A
@@ -5230,8 +5237,23 @@ Newsgroups:full
 @end example
 
 to the end of her @file{overview.fmt} file, then you can use that just
-as you would the extra headers from the mail groups.
+as you would the extra headers from the mail groups.  Otherwise, you
+have to disable fetching headers with @samp{XOVER}:
+
+@lisp
+(setq nntp-nov-is-evil t
+      gnus-nov-is-evil t)
+@end lisp
+
+Be aware, though, that this will make entering an @acronym{NNTP} group
+much, much slower, so this is not recommended.
 
+One particular scenario in which it can be desirable to not use
+@samp{XOVER} is for @code{nnvirtual} groups in order to support
+limiting by extra headers (e.g., by the newsgroup of its component
+groups).  Because group parameters are not inherited, a separate
+select method for the component groups with the appropriate
+@code{nov-is-evil} set as a method variable is required.
 
 @node Summary Buffer Mode Line
 @subsection Summary Buffer Mode Line
@@ -6608,14 +6630,16 @@ articles into the cache.  For more information,
 @kindex # @r{(Summary)}
 @kindex M P p @r{(Summary)}
 @findex gnus-summary-mark-as-processable
-Mark the current article with the process mark
-(@code{gnus-summary-mark-as-processable}).
-@findex gnus-summary-unmark-as-processable
+Toggle the process mark for the current article
+(@code{gnus-summary-mark-as-processable}).@*
+If @code{gnus-process-mark-toggle} is @code{nil}, set the process mark
+for the current article.
 
 @item M P u
 @itemx M-#
 @kindex M P u @r{(Summary)}
 @kindex M-# @r{(Summary)}
+@findex gnus-summary-unmark-as-processable
 Remove the process mark, if any, from the current article
 (@code{gnus-summary-unmark-as-processable}).
 
@@ -7503,6 +7527,7 @@ Matching}).
 @findex gnus-thread-sort-by-author
 @findex gnus-thread-sort-by-recipient
 @findex gnus-thread-sort-by-number
+@findex gnus-thread-sort-by-newsgroups
 @findex gnus-thread-sort-by-random
 @vindex gnus-thread-sort-functions
 @findex gnus-thread-sort-by-most-recent-number
@@ -7520,6 +7545,7 @@ predicate functions include 
@code{gnus-thread-sort-by-number},
 @code{gnus-thread-sort-by-score},
 @code{gnus-thread-sort-by-most-recent-number},
 @code{gnus-thread-sort-by-most-recent-date},
+@code{gnus-thread-sort-by-newsgroups} and
 @code{gnus-thread-sort-by-random} and
 @code{gnus-thread-sort-by-total-score}.
 
@@ -7581,6 +7607,7 @@ tickles your fancy.
 @findex gnus-article-sort-by-score
 @findex gnus-article-sort-by-subject
 @findex gnus-article-sort-by-author
+@findex gnus-article-sort-by-newsgroups
 @findex gnus-article-sort-by-random
 @findex gnus-article-sort-by-number
 @findex gnus-article-sort-by-most-recent-number
@@ -7592,8 +7619,8 @@ different functions for article comparison.  Available 
sorting
 predicate functions are @code{gnus-article-sort-by-number},
 @code{gnus-article-sort-by-author},
 @code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
-@code{gnus-article-sort-by-random}, and
-@code{gnus-article-sort-by-score}.
+@code{gnus-article-sort-by-newsgroups}, @code{gnus-article-sort-by-random},
+and @code{gnus-article-sort-by-score}.
 
 If you want to sort an unthreaded summary display by subject, you could
 say something like:
@@ -10381,6 +10408,17 @@ Sort by article ``readedness'' marks 
(@code{gnus-summary-sort-by-marks}).
 @findex gnus-summary-sort-by-score
 Sort by score (@code{gnus-summary-sort-by-score}).
 
+@item C-c C-s C-u
+@kindex C-c C-s C-u @r{(Summary)}
+@findex gnus-summary-sort-by-newsgroups
+Sort by newsgroups (@code{gnus-summary-sort-by-newsgroups}).
+
+@item C-c C-s C-x
+@kindex C-c C-s C-x @r{(Summary)}
+@findex gnus-summary-sort-by-extra
+Prompts for extra header to sort by (@code{gnus-summary-sort-by-extra}).
+An error will be raised if no sort functions for the header are defined.
+
 @item C-c C-s C-r
 @kindex C-c C-s C-r @r{(Summary)}
 @findex gnus-summary-sort-by-random
@@ -10553,13 +10591,15 @@ Here are the available keystrokes when using pick 
mode:
 @item .
 @kindex . @r{(Pick)}
 @findex gnus-pick-article-or-thread
-Pick the article or thread on the current line
-(@code{gnus-pick-article-or-thread}).  If the variable
+Pick the article or thread on the current line or unpick it if is
+already picked (@code{gnus-pick-article-or-thread}).  If the variable
 @code{gnus-thread-hide-subtree} is true, then this key selects the
 entire thread when used at the first article of the thread.  Otherwise,
 it selects just the article.  If given a numerical prefix, go to that
 thread or article and pick it.  (The line number is normally displayed
-at the beginning of the summary pick lines.)
+at the beginning of the summary pick lines.)  If
+@code{gnus-process-mark-toggle} is @code{nil}, this key will pick an
+article or thread.
 
 @item @key{SPC}
 @kindex SPC @r{(Pick)}
@@ -14515,6 +14555,17 @@ names.  If your IMAP mailboxes are called something 
like @samp{INBOX}
 and @samp{INBOX.Lists.emacs}, but you'd like the nnimap group names to
 be @samp{INBOX} and @samp{Lists.emacs}, you should enable this option.
 
+@item nnimap-keepalive-intervals
+By default, nnimap will send occasional @samp{NOOP} (keepalive)
+commands to the server, to keep the connection alive.  This option
+governs how often that happens.  It is a cons of two integers,
+representing seconds: first how often to run the keepalive check, and
+the second how many seconds of user inactivity are required to
+actually send the command.  The default, @code{(900 . 300)}, means run
+the check every fifteen minutes and, if the user has been inactive for
+five minutes, send the keepalive command.  Set to @code{nil} to
+disable keepalive commands altogether.
+
 @end table
 
 
diff --git a/doc/misc/mh-e.texi b/doc/misc/mh-e.texi
index 308ea3f..6254028 100644
--- a/doc/misc/mh-e.texi
+++ b/doc/misc/mh-e.texi
@@ -78,7 +78,7 @@ Public License.''
 @html
 <!--
 @end html
-@node Top, Preface, (dir), (dir)
+@node Top
 @top The MH-E Manual
 @html
 -->
@@ -197,7 +197,7 @@ History of MH-E
 -->
 @end html
 
-@node Preface, Conventions, Top, Top
+@node Preface
 @unnumbered Preface
 
 @cindex Emacs
@@ -272,7 +272,7 @@ Bill Wohler <@i{wohler at newt.com}>@*
 8 February 1995@*
 24 February 2006
 
-@node Conventions, Getting Started, Preface, Top
+@node Conventions
 @chapter GNU Emacs Terms and Conventions
 
 @cindex Emacs
@@ -513,7 +513,7 @@ you enter something in the minibuffer, but then you change 
your mind,
 type @kbd{C-g} and you'll be back where you started. If you want to
 exit Emacs entirely, use @kbd{C-x C-c}.
 
-@node Getting Started, Tour Through MH-E, Conventions, Top
+@node Getting Started
 @chapter Getting Started
 
 @cindex MH-E, versions
@@ -658,7 +658,7 @@ after these variables have been set. This hook can be used 
the change
 the value of these variables if you need to run with different values
 between MH and MH-E.
 
-@node Tour Through MH-E, Using This Manual, Getting Started, Top
+@node Tour Through MH-E
 @chapter Tour Through MH-E
 
 @cindex introduction
@@ -684,7 +684,7 @@ get the big picture, and then you can read the manual as 
you wish.
 * More About MH-E::
 @end menu
 
-@node Sending Mail Tour, Reading Mail Tour, Tour Through MH-E, Tour Through 
MH-E
+@node Sending Mail Tour
 @section Sending Mail
 
 @cindex MH-Letter mode
@@ -750,7 +750,7 @@ more complete help with the @kbd{C-h m} 
(@code{describe-mode})
 command.}, but at this time we'll only use @kbd{C-c C-c} to send your
 message. Type @kbd{C-c C-c} now. That's all there is to it!
 
-@node Reading Mail Tour, Processing Mail Tour, Sending Mail Tour, Tour Through 
MH-E
+@node Reading Mail Tour
 @section Receiving Mail
 
 @cindex @command{inc}
@@ -823,7 +823,7 @@ This is a test message to get the wheels churning...
 If you typed a long message, you can view subsequent pages with
 @key{SPC} and previous pages with @key{DEL}.
 
-@node Processing Mail Tour, Leaving MH-E, Reading Mail Tour, Tour Through MH-E
+@node Processing Mail Tour
 @section Processing Mail
 
 @cindex processing mail
@@ -949,7 +949,7 @@ available via the prefix characters, type the prefix 
character
 followed by a @kbd{?}, for example, @kbd{F ?}. More complete help is
 available with the @kbd{C-h m} (@code{describe-mode}) command.
 
-@node Leaving MH-E, More About MH-E, Processing Mail Tour, Tour Through MH-E
+@node Leaving MH-E
 @section Leaving MH-E
 
 @cindex Emacs, quitting
@@ -988,7 +988,7 @@ already exists, so you can use @samp{folders -recurse 
-fast} in a
 script to copy all of your messages into a single file, or using the
 @samp{-file} argument, a file for each folder.
 
-@node More About MH-E,  , Leaving MH-E, Tour Through MH-E
+@node More About MH-E
 @section More About MH-E
 
 These are the basic commands to get you going, but there are plenty
@@ -1054,7 +1054,7 @@ Place messages in a file (@pxref{Files and Pipes}).
 Remember that you can also use MH commands when you're not running
 MH-E (and when you are!).
 
-@node Using This Manual, Incorporating Mail, Tour Through MH-E, Top
+@node Using This Manual
 @chapter Using This Manual
 
 This chapter begins the meat of the manual which goes into more detail
@@ -1150,7 +1150,7 @@ your initials. (Unless, of course, your initials happen 
to be @emph{mh}!)
 * Folder Selection::
 @end menu
 
-@node Options, Ranges, Using This Manual, Using This Manual
+@node Options
 @section Options
 
 @cindex Emacs, customizing
@@ -1210,7 +1210,7 @@ function. Try entering @kbd{M-x customize-group @key{RET} 
mh
 the MH-E customization groups. Another way to view the MH-E
 customization group is to use @kbd{M-x mh-customize @key{RET}}.
 
-@node Ranges, Folder Selection, Options, Using This Manual
+@node Ranges
 @section Ranges
 
 @c Sync with mh-folder-mode docstring.
@@ -1279,7 +1279,7 @@ interpret input such as @samp{200} as @samp{last:200} if 
the
 default). If you need to scan just the message 200, then use the range
 @samp{200:1} or @samp{200-200}.
 
-@node Folder Selection,  , Ranges, Using This Manual
+@node Folder Selection
 @section Folder Selection
 
 @cindex completion, folders
@@ -1359,7 +1359,7 @@ folder name used is suggested. This is useful if you get 
mail from
 various people for whom you have an alias, but file them all in the
 same project folder.
 
-@node Incorporating Mail, Reading Mail, Using This Manual, Top
+@node Incorporating Mail
 @chapter Incorporating Your Mail
 
 @cindex @samp{Folder} menu
@@ -1535,7 +1535,7 @@ the message numbers from outside of MH-E.
 @end group
 @end smalllisp
 
-@node Reading Mail, Folders, Incorporating Mail, Top
+@node Reading Mail
 @chapter Reading Your Mail
 
 @cindex @samp{+inbox}
@@ -2003,7 +2003,7 @@ detail in the following sections.
 * Miscellaneous Commands and Options::
 @end menu
 
-@node Viewing, Viewing Attachments, Reading Mail, Reading Mail
+@node Viewing
 @section Viewing Your Mail
 
 @findex mh-header-display
@@ -2276,7 +2276,7 @@ of @code{"@{show-%s@} %d"} yields a mode line of
 -----@{show-+inbox@} 4      (MH-Show)--Bot--------------------------------
 @end smallexample
 
-@node Viewing Attachments, HTML, Viewing, Reading Mail
+@node Viewing Attachments
 @section Viewing Attachments
 
 @cindex attachments
@@ -2516,7 +2516,7 @@ Article Buttons} and
 in the @cite{The Gnus Manual}.
 @end ifnotinfo
 
-@node HTML, Digests, Viewing Attachments, Reading Mail
+@node HTML
 @section HTML
 
 @cindex HTML
@@ -2670,7 +2670,7 @@ buffer, including HTML buffers.
 (global-set-key [S-mouse-2] 'browse-url-at-mouse)
 @end smalllisp
 
-@node Digests, Reading PGP, HTML, Reading Mail
+@node Digests
 @section Digests
 
 @cindex digests
@@ -2714,7 +2714,7 @@ preceded with a @samp{>} so that your reply can't create 
the
 @samp{To:} field yourself. This is described later (@pxref{Editing
 Drafts}).
 
-@node Reading PGP, Printing, Digests, Reading Mail
+@node Reading PGP
 @section Signed and Encrypted Messages
 
 @cindex GPG
@@ -2848,7 +2848,7 @@ See
 @cite{The PGG Manual}}.
 @end ifhtml
 
-@node Printing, Files and Pipes, Reading PGP, Reading Mail
+@node Printing
 @section Printing Your Mail
 
 @cindex printing
@@ -2933,7 +2933,7 @@ If you do this, do not delete the message until it is 
printed or else
 the output may be truncated. These options are not used by the
 commands @kbd{P p} or @kbd{P f}.
 
-@node Files and Pipes, Navigating, Printing, Reading Mail
+@node Files and Pipes
 @section Files and Pipes
 
 @cindex files
@@ -2993,7 +2993,7 @@ through @command{uuencode} or @command{shar}. For 
example, you can
 extract the contents of the current buffer in your home directory by
 typing @kbd{M-x mh-store-buffer @key{RET} ~ @key{RET}}.
 
-@node Navigating, Miscellaneous Commands and Options, Files and Pipes, Reading 
Mail
+@node Navigating
 @section Navigating
 
 @cindex moving between messages
@@ -3094,7 +3094,7 @@ The hook @code{mh-delete-msg-hook} is called after you 
mark a message
 for deletion. For example, a past maintainer of MH-E used this once
 when he kept statistics on his mail usage.
 
-@node Miscellaneous Commands and Options,  , Navigating, Reading Mail
+@node Miscellaneous Commands and Options
 @section Miscellaneous Commands and Options
 
 This section contains a few more miscellaneous commands and options.
@@ -3207,7 +3207,7 @@ displayed or @code{mh-rmail} is run, and the MH-E window 
configuration
 is shown. Otherwise, the MH-E window configuration is saved and the
 original configuration is displayed.
 
-@node Folders, Sending Mail, Reading Mail, Top
+@node Folders
 @chapter Organizing Your Mail with Folders
 
 @cindex @samp{Folder} menu
@@ -3842,7 +3842,7 @@ running dired on my mail directory (@kbd{M-x dired 
@key{RET} ~/Mail
 @key{RET}}), moving my cursor to @samp{out} and using the command
 @kbd{R} (@code{dired-do-rename}).
 
-@node Sending Mail, Editing Drafts, Folders, Top
+@node Sending Mail
 @chapter Sending Mail
 
 @cindex sending mail
@@ -4002,7 +4002,7 @@ more detail in the following sections.
 * Editing Again::
 @end menu
 
-@node Composing, Replying, Sending Mail, Sending Mail
+@node Composing
 @section Composing
 
 @cindex @file{.emacs}
@@ -4125,7 +4125,7 @@ is that you can write a function to write and send the 
message for
 you. This function is passed three arguments: the contents of the
 @samp{To:}, @samp{Subject:}, and @samp{Cc:} header fields.
 
-@node Replying, Forwarding, Composing, Sending Mail
+@node Replying
 @section Replying to Mail
 
 @cindex @command{mhl}
@@ -4221,7 +4221,7 @@ buffer by turning off the option 
@code{mh-reply-show-message-flag}.
 If you wish to customize the header or other parts of the reply draft,
 please see @command{repl}(1) and @code{mh-format}(5).
 
-@node Forwarding, Redistributing, Replying, Sending Mail
+@node Forwarding
 @section Forwarding Mail
 
 @cindex @command{forw}
@@ -4283,7 +4283,7 @@ and creates a subject header field of:
 Subject: Greg DesBrisay: Re: 49er football
 @end smallexample
 
-@node Redistributing, Editing Again, Forwarding, Sending Mail
+@node Redistributing
 @section Redistributing Your Mail
 
 @cindex @command{dist}
@@ -4323,7 +4323,7 @@ a message that has been redistributed before, turn off 
this option.
 The hook @code{mh-annotate-msg-hook} is run after annotating the
 message and scan line (@pxref{Sending Mail}).
 
-@node Editing Again,  , Redistributing, Sending Mail
+@node Editing Again
 @section Editing Old Drafts and Bounced Messages
 
 @cindex @file{draft}
@@ -4359,7 +4359,7 @@ the message for editing by removing the @i{Mailer-Daemon} 
envelope and
 unneeded header fields. Fix whatever addressing problem you had, and
 send the message again with @kbd{C-c C-c}.
 
-@node Editing Drafts, Aliases, Sending Mail, Top
+@node Editing Drafts
 @chapter Editing a Draft
 
 @cindex @samp{Letter} menu
@@ -4754,7 +4754,7 @@ detail in the following sections.
 * Killing Draft::
 @end menu
 
-@node Editing Message, Inserting Letter, Editing Drafts, Editing Drafts
+@node Editing Message
 @section Editing the Message
 
 @cindex @samp{Bcc} header field
@@ -4929,7 +4929,7 @@ the first period in the paragraph above, the result would 
be this:
 @end group
 @end smallexample
 
-@node Inserting Letter, Inserting Messages, Editing Message, Editing Drafts
+@node Inserting Letter
 @section Inserting Letter to Which You're Replying
 
 @cindex inserting messages
@@ -5055,7 +5055,7 @@ For example, if you use the hook function
 @code{trivial-cite}} (which is NOT part of Emacs), set
 @code{mh-yank-behavior} to @samp{Body and Header}.
 
-@node Inserting Messages, Signature, Inserting Letter, Editing Drafts
+@node Inserting Messages
 @section Inserting Messages
 
 @cindex inserting messages
@@ -5081,7 +5081,7 @@ left intact, the message is not indented, and @samp{> } 
is not
 inserted before each line. This command leaves the mark before the
 letter and point after it.
 
-@node Signature, Picture, Inserting Messages, Editing Drafts
+@node Signature
 @section Inserting Your Signature
 
 @cindex signature
@@ -5136,7 +5136,7 @@ function used to insert the signature with
 The signature can also be inserted using Identities.
 @xref{Identities}.
 
-@node Picture, Adding Attachments, Signature, Editing Drafts
+@node Picture
 @section Inserting Your Picture
 
 @cindex @file{.face}
@@ -5186,7 +5186,7 @@ defined by this option doesn't exist.
 
 @xref{Viewing}, to see how these header fields are displayed in MH-E.
 
-@node Adding Attachments, Sending PGP, Picture, Editing Drafts
+@node Adding Attachments
 @section Adding Attachments
 
 @cindex @command{mhbuild}
@@ -5530,7 +5530,7 @@ prefix argument (as in @kbd{C-u C-c C-e}).
 The hook @code{mh-mh-to-mime-hook} is called after the message has
 been formatted by @kbd{C-c C-e}.
 
-@node Sending PGP, Checking Recipients, Adding Attachments, Editing Drafts
+@node Sending PGP
 @section Signing and Encrypting Messages
 
 @cindex signing messages
@@ -5621,7 +5621,7 @@ all messages I encrypt are encrypted with my public key 
as well. If
 you keep a copy of all of your outgoing mail with a @samp{Fcc:} header
 field, this setting is vital so that you can read the mail you write!
 
-@node Checking Recipients, Sending Message, Sending PGP, Editing Drafts
+@node Checking Recipients
 @section Checking Recipients
 
 @cindex @file{*MH-E Recipients*}
@@ -5640,7 +5640,7 @@ you can check the actual address(es) in the alias. A new 
buffer named
 @uref{@value{MH-BOOK-HOME}/senove.html#WhaPro, What now?---and the
 whatnow Program} in the MH book.}.
 
-@node Sending Message, Killing Draft, Checking Recipients, Editing Drafts
+@node Sending Message
 @section Sending a Message
 
 @cindex buffers, @file{*MH-E Mail Delivery*}
@@ -5678,7 +5678,7 @@ in the MH book.} is installed under a different name, use
 The hook @code{mh-annotate-msg-hook} is run after annotating the
 message and scan line (@pxref{Sending Mail}).
 
-@node Killing Draft,  , Sending Message, Editing Drafts
+@node Killing Draft
 @section Killing the Draft
 
 @cindex killing draft
@@ -5692,7 +5692,7 @@ command @kbd{C-c C-q} (@code{mh-fully-kill-draft}) to 
kill the draft
 buffer and delete the draft message. Use the command @kbd{C-x k}
 (@code{kill-buffer}) if you don't want to delete the draft message.
 
-@node Aliases, Identities, Editing Drafts, Top
+@node Aliases
 @chapter Aliases
 
 @cindex aliases
@@ -6019,7 +6019,7 @@ Syntax of Regular Expressions} in
 @cite{The GNU Emacs Manual}).
 @end ifhtml
 
-@node Identities, Speedbar, Aliases, Top
+@node Identities
 @chapter Identities
 
 @cindex identities
@@ -6256,7 +6256,7 @@ example, @samp{:signature}), and the action 
@samp{'remove} or
 @samp{'add}. If the action is @samp{'add}, an additional argument
 containing the value for the field is given.
 
-@node Speedbar, Menu Bar, Identities, Top
+@node Speedbar
 @chapter The Speedbar
 
 @cindex folder navigation
@@ -6354,7 +6354,7 @@ Selected folder face.
 Selected folder face when folder contains unread messages.
 @end vtable
 
-@node Menu Bar, Tool Bar, Speedbar, Top
+@node Menu Bar
 @chapter The Menu Bar
 
 @cindex @samp{Folder} menu
@@ -6414,7 +6414,7 @@ manual in two ways: all of the menu items are listed 
alphabetically,
 and you can also browse all of the items under the index entry
 @samp{menu item}.
 
-@node Tool Bar, Searching, Menu Bar, Top
+@node Tool Bar
 @chapter The Tool Bar
 
 @cindex tool bar
@@ -6498,7 +6498,7 @@ variable is set to anything other than @samp{Same As 
Default Tool Bar}
 and the default tool bar is in a different location, then two tool
 bars will be displayed: the MH-E tool bar and the default tool bar.
 
-@node Searching, Threading, Tool Bar, Top
+@node Searching
 @chapter Searching Through Messages
 
 @cindex @samp{Search} menu
@@ -7037,7 +7037,7 @@ MH-Search buffer. Instead, you simply enter a regular 
expression in
 the minibuffer. For help in constructing regular expressions, see your
 man page for @command{grep}.
 
-@node Threading, Limits, Searching, Top
+@node Threading
 @chapter Viewing Message Threads
 
 @cindex threading
@@ -7166,7 +7166,7 @@ ensure that the byte-compiled version appears first in the
 installed MH-E yourself, please refer to the installation directions
 in the file @file{README} in the distribution.}.
 
-@node Limits, Sequences, Threading, Top
+@node Limits
 @chapter Limiting Display
 
 @cindex limits
@@ -7274,7 +7274,7 @@ command to limit the display to messages in a range 
(@pxref{Ranges}).
 Each limit can be undone in turn with the @kbd{/ w} (@code{mh-widen})
 command. Give this command a prefix argument to remove all limits.
 
-@node Sequences, Junk, Limits, Top
+@node Sequences
 @chapter Using Sequences
 
 @cindex @samp{Sequence} menu
@@ -7528,7 +7528,7 @@ command dealing with sequences is 
@command{mark}@footnote{See the
 section @uref{@value{MH-BOOK-HOME}/mmbwm.html, Make Message Bookmarks
 with mark} in the MH book.}.
 
-@node Junk, Miscellaneous, Sequences, Top
+@node Junk
 @chapter Dealing With Junk Mail
 
 @cindex Marshall Rose
@@ -7966,7 +7966,7 @@ spam/unreadable/.
 spam/unreadable/.
 @end smallexample
 
-@node Miscellaneous, Scan Line Formats, Junk, Top
+@node Miscellaneous
 @chapter Miscellaneous Commands, Variables, and Buffers
 
 This chapter covers the following command and the various MH-E
@@ -8053,7 +8053,7 @@ it is hidden because the first character in the name is a 
space.
 You'll generally not have any need for this buffer.
 @end table
 
-@node Scan Line Formats, Procmail, Miscellaneous, Top
+@node Scan Line Formats
 @appendix Scan Line Formats
 
 @cindex scan line formats
@@ -8521,7 +8521,7 @@ Finally, add the following to delete and refile messages.
 This is just a bare minimum; it's best to adjust all of the regular
 expressions to ensure that MH-E and highlighting perform well.
 
-@node Procmail, Odds and Ends, Scan Line Formats, Top
+@node Procmail
 @appendix Reading Mailing Lists Effectively
 
 @cindex @command{procmail}
@@ -8680,7 +8680,7 @@ example above, you would tell Gnus about it the first 
time only with
 @kbd{G m gnucash @key{RET} nnml @key{RET}}. In MH-E, this folder is
 known as @samp{+gnucash}.
 
-@node Odds and Ends, History, Procmail, Top
+@node Odds and Ends
 @appendix Odds and Ends
 
 This appendix covers a few topics that don't fit elsewhere. Here I
@@ -8694,7 +8694,7 @@ I also point out some additional sources of information.
 * Getting MH-E::
 @end menu
 
-@node Bug Reports, Mailing Lists, Odds and Ends, Odds and Ends
+@node Bug Reports
 @appendixsec Bug Reports
 
 @cindex bugs
@@ -8708,7 +8708,7 @@ to do that it shouldn't be a restriction for you. Please 
include the
 output of @kbd{M-x mh-version} (@pxref{Miscellaneous}) in any bug
 report you send unless you're 110% positive we won't ask for it.
 
-@node Mailing Lists, MH FAQ and Support, Bug Reports, Odds and Ends
+@node Mailing Lists
 @appendixsec MH-E Mailing Lists
 
 @cindex SourceForge
@@ -8721,7 +8721,7 @@ the archives at 
@uref{https://sourceforge.net/p/mh-e/mailman/,
 SourceForge}. Do not report bugs on these lists; please submit them
 via SourceForge (@pxref{Bug Reports}).
 
-@node MH FAQ and Support, Getting MH-E, Mailing Lists, Odds and Ends
+@node MH FAQ and Support
 @appendixsec MH FAQ and Support
 
 @cindex FAQ
@@ -8740,7 +8740,7 @@ You can find FAQs on MH-E by searching for 
@i{labels:support} on the
 Tickets} page on SourceForge. If you don't find the answer to your
 question, file a ticket and your question will become a new FAQ!
 
-@node Getting MH-E,  , MH FAQ and Support, Odds and Ends
+@node Getting MH-E
 @appendixsec Getting MH-E
 
 @cindex MH-E, obtaining
@@ -8795,7 +8795,7 @@ also contains doc and contrib packages. The former is the 
latest
 release of this manual, and the latter contains a few contributed
 packages you might find useful.
 
-@node History, GFDL, Odds and Ends, Top
+@node History
 @appendix History of MH-E
 
 @cindex Bill Wohler
@@ -8826,7 +8826,7 @@ lives today.
 * From Bill Wohler::
 @end menu
 
-@node From Brian Reid, From Jim Larus, History, History
+@node From Brian Reid
 @appendixsec From Brian Reid
 
 @cindex Brian Reid
@@ -8858,7 +8858,7 @@ the ideas as well. Perhaps one day, MH-E will again 
resemble MHE
 
 Brian Reid, June 1994
 
-@node From Jim Larus, From Stephen Gildea, From Brian Reid, History
+@node From Jim Larus
 @appendixsec From Jim Larus
 
 @cindex Jim Larus
@@ -8904,7 +8904,7 @@ since then.
 
 Jim Larus, June 1994
 
-@node From Stephen Gildea, From Bill Wohler, From Jim Larus, History
+@node From Stephen Gildea
 @appendixsec From Stephen Gildea
 
 @cindex Gildea, Stephen
@@ -8946,7 +8946,7 @@ version 5 was released.
 
 Stephen Gildea, June 1994
 
-@node From Bill Wohler,  , From Stephen Gildea, History
+@node From Bill Wohler
 @appendixsec From Bill Wohler
 
 @cindex Wohler, Bill
@@ -8993,27 +8993,27 @@ new features and several bug fixes.
 
 Bill Wohler, August 2008
 
-@node GFDL, GPL, History, Top
+@node GFDL
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
-@node GPL, Key Index, GFDL, Top
+@node GPL
 @appendix GNU General Public License
 @include gpl.texi
 
-@node Key Index, Command Index, GPL, Top
+@node Key Index
 @unnumbered Key (Character) Index
 @printindex ky
 
-@node Command Index, Option Index, Key Index, Top
+@node Command Index
 @unnumbered Command Index
 @printindex fn
 
-@node Option Index, Concept Index, Command Index, Top
+@node Option Index
 @unnumbered Option (Variable) Index
 @printindex vr
 
-@node Concept Index,  , Option Index, Top
+@node Concept Index
 @unnumbered Concept Index
 @printindex cp
 
diff --git a/doc/misc/modus-themes.org b/doc/misc/modus-themes.org
index 001ed57..9b1a001 100644
--- a/doc/misc/modus-themes.org
+++ b/doc/misc/modus-themes.org
@@ -3,11 +3,11 @@
 #+email: info@protesilaos.com
 #+language: en
 #+options: ':t toc:nil author:t email:t
+#+startup: content
 
-#+macro: stable-version 1.3.2
-#+macro: release-date 2021-04-18
-#+macro: development-version 1.4.0-dev
-#+macro: export-date (eval (format-time-string "%F %R %z" (current-time)))
+#+macro: stable-version 1.4.0
+#+macro: release-date 2021-05-25
+#+macro: development-version 1.5.0-dev
 #+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
 #+macro: space @@texinfo:@: @@
 #+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
@@ -32,8 +32,7 @@ The documentation furnished herein corresponds to stable 
version
 feature which does not yet form part of the latest tagged commit, is
 explicitly marked as such.
 
-Current development target is {{{development-version}}}.  This manual was
-built on {{{export-date}}}.
+Current development target is {{{development-version}}}.
 
 #+toc: headlines 8 insert TOC here, with eight headline levels
 
@@ -82,6 +81,11 @@ To ensure that users have a consistently accessible 
experience, the
 themes strive to achieve as close to full face coverage as possible
 ([[#h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19][Face coverage]]).
 
+Furthermore, the themes are designed to empower users with red-green
+color deficiency (deuteranopia).  This is achieved through customization
+options which have the effect of replacing all relevant instances of
+green with a variant of blue 
([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]).
+
 Starting with version 0.12.0 and onwards, the themes are built into GNU
 Emacs.
 
@@ -367,6 +371,113 @@ set to nil.
 Remember that all customization options must be evaluated before loading
 a theme ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]).
 
+Below is a summary of what you will learn in the subsequent sections of
+this manual.
+
+#+begin_src emacs-lisp
+(setq modus-themes-slanted-constructs t
+      modus-themes-bold-constructs nil
+      modus-themes-no-mixed-fonts nil
+      modus-themes-subtle-line-numbers nil
+      modus-themes-success-deuteranopia t
+
+      modus-themes-fringes nil ; {nil,'subtle,'intense}
+
+      ;; Options for `modus-themes-lang-checkers': nil,
+      ;; 'straight-underline, 'subtle-foreground,
+      ;; 'subtle-foreground-straight-underline, 'intense-foreground,
+      ;; 'intense-foreground-straight-underline, 'colored-background
+      modus-themes-lang-checkers nil
+
+      ;; Options for `modus-themes-mode-line': nil, '3d, 'moody,
+      ;; 'borderless, 'borderless-3d, 'borderless-moody, 'accented,
+      ;; 'accented-3d, 'accented-moody, 'borderless-accented,
+      ;; 'borderless-accented-3d, 'borderless-accented-moody
+      modus-themes-mode-line '3d
+
+      ;; Options for `modus-themes-syntax': nil, 'faint,
+      ;; 'yellow-comments, 'green-strings,
+      ;; 'yellow-comments-green-strings, 'alt-syntax,
+      ;; 'alt-syntax-yellow-comments, 'faint-yellow-comments
+      modus-themes-syntax nil
+
+      ;; Options for `modus-themes-hl-line': nil, 'intense-background,
+      ;; 'accented-background, 'underline-neutral,
+      ;; 'underline-accented, 'underline-only-neutral,
+      ;; 'underline-only-accented
+      modus-themes-hl-line 'underline-neutral
+
+      modus-themes-paren-match 'subtle-bold ; 
{nil,'subtle-bold,'intense,'intense-bold}
+
+      ;; Options for `modus-themes-links': nil, 'faint,
+      ;; 'neutral-underline, 'faint-neutral-underline, 'no-underline,
+      ;; 'underline-only, 'neutral-underline-only
+      modus-themes-links 'neutral-underline
+
+      ;; Options for `modus-themes-prompts': nil, 'subtle-accented,
+      ;; 'intense-accented, 'subtle-gray, 'intense-gray
+      modus-themes-prompts 'subtle-gray
+
+      modus-themes-completions 'moderate ; {nil,'moderate,'opinionated}
+
+      modus-themes-mail-citations nil ; {nil,'faint,'monochrome}
+
+      ;; Options for `modus-themes-region': nil, 'no-extend, 'bg-only,
+      ;; 'bg-only-no-extend, 'accent, 'accent-no-extend
+      modus-themes-region 'bg-only-no-extend
+
+      ;; Options for `modus-themes-diffs': nil, 'desaturated,
+      ;; 'bg-only, 'deuteranopia, 'fg-only-deuteranopia
+      modus-themes-diffs 'fg-only-deuteranopia
+
+      modus-themes-org-blocks 'gray-background ; 
{nil,'gray-background,'tinted-background}
+      modus-themes-org-habit nil ; {nil,'simplified,'traffic-light}
+
+      modus-themes-headings ; this is an alist: read the manual or its doc 
string
+      '((1 . line)
+        (2 . rainbow-line-no-bold)
+        (t . no-bold))
+
+      modus-themes-variable-pitch-ui nil
+      modus-themes-variable-pitch-headings t
+      modus-themes-scale-headings t
+      modus-themes-scale-1 1.1
+      modus-themes-scale-2 1.15
+      modus-themes-scale-3 1.21
+      modus-themes-scale-4 1.27
+      modus-themes-scale-5 1.33)
+#+end_src
+
+** Option for color-coding success state (deuteranopia)
+:properties:
+:alt_title: Success' color-code
+:description: Toggle blue color for success or done states
+:custom_id: h:3ed03a48-20d8-4ce7-b214-0eb7e4c79abe
+:end:
+#+vindex: modus-themes-success-deuteranopia
+
+Symbol: ~modus-themes-success-deuteranopia~
+
+Possible values:
+
+1. ~nil~ (default)
+2. ~t~
+
+The default is to colorise all faces that denote "success", "done", or
+similar with a variant of green.
+
+With a non-nil value (~t~), use variants of blue instead of green.  This
+is meant to empower users with red-green color deficiency.
+
+The present customization option should apply to all contexts where
+there can be a color-coded distinction between success and failure,
+to-do and done, and so on.
+
+Diffs, which have a red/green dichotomy by default, can also be
+configured to conform with deuteranopia.
+
+[[#h:ea7ac54f-5827-49bd-b09f-62424b3b6427][Option for diff buffer looks]].
+
 ** Option for more bold constructs
 :properties:
 :alt_title: Bold constructs
@@ -591,21 +702,24 @@ Possible values:
 7. ~accented~
 8. ~accented-3d~
 9. ~accented-moody~
+10. ~borderless-accented~
+11. ~borderless-accented-3d~
+12. ~borderless-accented-moody~
 
 The default produces a two-dimensional effect both for the active and
-inactive modelines.  The differences between the two are limited to
+inactive mode lines.  The differences between the two are limited to
 distinct shades of grayscale values, with the active being more intense
 than the inactive.
 
-Option ~3d~ will make the active modeline look like a three-dimensional
-rectangle.  Inactive modelines remain 2D, though they are slightly toned
-down relative to the default.  This aesthetic is virtually the same as
-what you get when you run Emacs without any customizations (=emacs -Q= on
-the command line).
+Option ~3d~ will make the active mode line look like a three-dimensional
+rectangle.  Inactive mode lines remain 2D, though they are slightly
+toned down relative to the default.  This aesthetic is virtually the
+same as what you get when you run Emacs without any customizations
+(=emacs -Q= on the command line).
 
-While ~moody~ removes all box effects from the modelines and applies
+While ~moody~ removes all box effects from the mode lines and applies
 underline and overline properties instead.  It also tones down a bit the
-inactive modelines.  This is meant to optimize things for use with the
+inactive mode lines.  This is meant to optimize things for use with the
 [[https://github.com/tarsius/moody][moody package]] (hereinafter referred to 
as "Moody"), though it can work
 fine even without it.
 
@@ -616,7 +730,7 @@ creating some padding.
 
 The ~borderless-3d~ and ~borderless-moody~ approximate the ~3d~ and ~moody~
 options respectively, while removing the borders.  However, to ensure
-that the inactive modelines remain visible, they apply a slightly more
+that the inactive mode lines remain visible, they apply a slightly more
 prominent background to them than what their counterparts do (same
 inactive background as with the default).
 
@@ -625,12 +739,17 @@ default (~nil~), ~3d~, and ~moody~ styles respectively, 
except that the active
 mode line uses a colored background instead of the standard shade of
 gray.
 
+Same principle for ~borderless-accented~, ~borderless-accented-3d~, and
+~borderless-accented-moody~ which use a colored background for the active
+mode line and have no discernible borders around both the active and
+inactive the mode lines.
+
 Note that Moody does not expose any faces that the themes could style
 directly.  Instead it re-purposes existing ones to render its tabs and
 ribbons.  As such, there may be cases where the contrast ratio falls
 below the 7:1 target that the themes conform with (WCAG AAA).  To hedge
 against this, we configure a fallback foreground for the ~moody~ option,
-which will come into effect when the background of the modeline changes
+which will come into effect when the background of the mode line changes
 to something less accessible, such as Moody ribbons (read the doc string
 of ~set-face-attribute~, specifically ~:distant-foreground~).  This fallback
 is activated when Emacs determines that the background and foreground of
@@ -671,11 +790,12 @@ completion UI.  The interfaces can be grouped in two 
categories, based
 on their default aesthetics: (i) those that only or mostly use
 foreground colors for their interaction model, and (ii) those that
 combine background and foreground values for some of their metaphors.
-The former category encompasses Icomplete, Ido, Selectrum as well as
-pattern matching styles like Orderless and Flx.  The latter covers Helm,
-Ivy, and similar.
+The former category encompasses Icomplete, Ido, Selectrum, Vertico, as
+well as pattern matching styles like Orderless and Flx.  The latter
+covers Helm, Ivy, and Sallet.
 
-A value of ~nil~ will respect the metaphors of each completion framework.
+A value of ~nil~ (the default) will simply respect the metaphors of each
+completion framework.
 
 Option ~moderate~ applies a combination of background and foreground that
 is fairly subtle.  For Icomplete and friends this constitutes a
@@ -694,6 +814,35 @@ To appreciate the scope of this customization option, you 
should spend
 some time with every one of the ~nil~ (default), ~moderate~, and ~opinionated~
 possibilities.
 
+** Option for mail citations
+:properties:
+:alt_title: Mail citations
+:description: Choose among colorful, desaturated, monochrome citations
+:custom_id: h:5a12765d-0ba0-4a75-ab11-e35d3bbb317d
+:end:
+#+vindex: modus-themes-mail-citations
+
+Symbol: ~modus-themes-mail-citations~
+
+Possible values:
+
+1. ~nil~ (default)
+2. ~faint~
+3. ~monochrome~
+
+By default, citations in email-related buffers apply contrasting hues to
+different levels of depth in cited text.  The colors are fairly easy to
+tell apart.
+
+A value of ~faint~ makes all citation levels less intense, while retaining
+the default style of contrasting hues (albeit very subtle ones).
+
+Option ~monochrome~ turns all citations in to a uniform shade of gray.
+
+Whatever the value assigned to this variable, citations in emails are
+controlled by typographic elements or indentation, which the themes do
+not touch.
+
 ** Option for fringe visibility
 :properties:
 :alt_title: Fringes
@@ -792,8 +941,8 @@ The default is to use a subtle gray background for the 
current line when
 The ~intense-background~ applies a more prominent gray to the background
 of the current line.
 
-With ~accented-background~ the default's subtle aesthetic is retained, but
-the background has a more colored hint.
+With ~accented-background~ the background gets a colored hint and is more
+prominent than the default.
 
 The ~underline-neutral~ combines the default subtle neutral background
 with a gray underline.
@@ -926,53 +1075,42 @@ Possible values:
 
 1. ~nil~ (default)
 2. ~desaturated~
-3. ~fg-only~
-4. ~bg-only~
-5. ~deuteranopia~
-
-By default the themes apply rich coloration to the output of diffs, such
-as those of ~diff-mode~, ~ediff~, ~smerge-mode~, and Magit.  These are
-color combinations of an accented background and foreground so that, for
-example, added lines have a pronounced green background with an
-appropriate shade of green for the affected text.  Word-wise or
-"refined" changes follow this pattern but use different shades of those
-colors to remain distinct.
-
-Option ~desaturated~ tones down all relevant color values.  It still
-combines an accented background with an appropriate foreground, yet its
-overall impression is fairly subtle.  Refined changes are a bit more
-intense to fulfil their intended function, though still less saturated
-than default.
-
-Option ~fg-only~ will remove most accented backgrounds and instead rely
-on color-coded text to denote changes.  For instance, added lines use a
-green foreground, while their background is the same as the rest of the
-buffer.  Word-wise highlights still use a background value which is,
-nonetheless, more subtle than its default equivalent.
-
-Option ~bg-only~ applies color-coded backgrounds but does not override
-any syntax highlighting that may be present.  This makes it suitable for
-use with a non-nil value for ~diff-font-lock-syntax~ (which is the
-default for ~diff-mode~ buffers in Emacs 27 or higher).
-
-Option ~deuteranopia~ optimizes for red-green color deficiency.  It
-replaces all instances of green with blue variants.  This is to ensure
-that indicators for "removed" and "added" states are not mistaken for
-each other.
-
-Concerning Magit, an extra set of tweaks are introduced for the effect
-of highlighting the current diff hunk, so as to remain aligned with the
-overall experience of that mode.  Expect changes that are consistent
-with the overall intent of the aforementioned.  Note, however, that the
-~bg-only~ option will not deliver the intended results in Magit diffs
-because no syntax highlighting is used there (last checked with Magit
-version 20201116.1057, though upstream has a plan to eventually support
-such a feature---this entry shall be updated accordingly).
+3. ~bg-only~
+4. ~deuteranopia~
+5. ~fg-only-deuteranopia~
+
+The default (~nil~) uses fairly intense color combinations for diffs, by
+applying prominently colored backgrounds, with appropriate foregrounds.
+
+Option ~desaturated~ follows the same principles as with the default
+(~nil~), though it tones down all relevant colors.
+
+Option ~bg-only~ applies a background but does not override the text's
+foreground.  This makes it suitable for a non-nil value passed to
+~diff-font-lock-syntax~ (note: Magit does not support syntax highlighting
+in diffs---last checked on 2021-04-21).
+
+Option ~deuteranopia~ is like the default (~nil~) in terms of using
+prominently colored backgrounds, except that it also accounts for
+red-green color defficiency by replacing all instances of green with
+colors on the blue side of the spectrum.  Other stylistic changes are
+made in the interest of optimizing for such a use-case.
+
+Option ~fg-only-deuteranopia~ removes all colored backgrounds, except from
+word-wise or refined changes.  Instead, it only uses color-coded
+foreground values to differentiate between added, removed, and changed
+lines.  If a background is necessary to denote context, a subtle
+grayscale value is applied.  The color used for added lines is a variant
+of blue to account for red-green color defficiency but also because
+green text alone is hard to discern in the diff's context (hard for our
+accessibility purposes).  The ~fg-only~ option that existed in older
+versions of the themes is now an alias of ~fg-only-deuteranopia~, in the
+interest of backward compatibility.
 
 ** Option for org-mode block styles
 :properties:
 :alt_title: Org mode blocks
-:description: Choose among plain, grayscale, or rainbow styles
+:description: Choose among plain, gray, or tinted backgrounds
 :custom_id: h:b7e328c0-3034-4db7-9cdf-d5ba12081ca2
 :end:
 #+vindex: modus-themes-org-blocks
@@ -982,32 +1120,33 @@ Symbol: ~modus-themes-org-blocks~
 Possible values:
 
 1. ~nil~ (default)
-2. ~grayscale~
-3. ~rainbow~
+2. ~gray-background~ (value ~grayscale~ exists for backward compatibility)
+3. ~tinted-background~ (value ~rainbow~ exists for backward compatibility)
 
-The default is to use the same background as the rest of the buffer for
-the contents of the block.
+The default means that the block has no distinct background of its own
+and uses the one that applies to the rest of the buffer.
 
-Option ~grayscale~ applies a subtle neutral gray background to the block's
-contents.  It will also extend to the edge of the window the background
-of the "begin" and "end" block delimiter lines (only relevant for Emacs
-versions >= 27 where the 'extend' keyword is part of the face
-specifications).
+Option ~gray-background~ applies a subtle gray background to the block's
+contents.  It also affects the begin and end lines of the block: their
+background extends to the edge of the window for Emacs version >= 27
+where the ~:extend~ keyword is recognized by ~set-face-attribute~ (this is
+contingent on the variable ~org-fontify-whole-block-delimiter-line~).
 
-Option ~rainbow~ uses an accented background for the contents of the
-block.  The exact color will depend on the programming language and is
-controlled by the ~org-src-block-faces~ variable.  This is most suitable
-for users who work on literate programming documents that mix and match
-several languages.
+Option ~tinted-background~ uses a slightly colored background for the
+contents of the block.  The exact color will depend on the programming
+language and is controlled by the variable ~org-src-block-faces~ (refer to
+the theme's source code for the current association list).  For this to
+take effect, Org must be restarted with {{{kbd(M-x org-mode-restart)}}}.
 
-Note that the "rainbow" blocks may require you to also reload the
-major-mode so that the colors are applied consistently throughout: use
-{{{kbd(M-x org-mode)}}} or {{{kbd(M-x org-mode-restart)}}} to refresh the 
buffer.
-Or start typing in each code block (inefficient at scale, but it still
-works).
+Code blocks use their major mode's colors only when the variable
+~org-src-fontify-natively~ is non-nil.  While quote/verse blocks require
+setting ~org-fontify-quote-and-verse-blocks~ to a non-nil value.
 
-The extent of Org block delimiter lines is controlled by the variable
-~org-fontify-whole-block-delimiter-line~.
+[[#h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50][Update Org block delimiter 
fontification]].
+
+Older versions of the themes provided options ~grayscale~ (or ~greyscale~)
+and ~rainbow~.  Those will continue to work as they are aliases for
+~gray-background~ and ~tinted-background~, respectively.
 
 ** Option for org-habit graph styles
 :properties:
@@ -1637,6 +1776,170 @@ Perhaps you may wish to generalise those findings in to 
a set of
 functions that also accept an arbitrary face.  We shall leave the
 experimentation up to you.
 
+** Cycle through arbitrary colors (DIY)
+:properties:
+:custom_id: h:77dc4a30-b96a-4849-85a8-fee3c2995305
+:end:
+#+cindex: Cycle colors
+
+Users may opt to customize individual faces of the themes to accommodate
+their particular needs.  One such case is with the color intensity of
+comments, specifically the foreground of ~font-lock-comment-face~.  The
+Modus themes set that to a readable value, in accordance with their
+accessibility objective, though users may prefer to lower the overall
+contrast on an on-demand basis.
+
+One way to achieve this is to design a command that cycles through three
+distinct levels of intensity, though the following can be adapted to any
+kind of cyclic behaviour, such as to switch between red, green, and
+blue.
+
+In the following example, we employ the ~modus-themes-color~ function
+which reads a symbol that represents an entry in the active theme's
+color palette ([[#h:1487c631-f4fe-490d-8d58-d72ffa3bd474][Case-by-case face 
specs using the themes' palette]]).
+Those are stored in ~my-modus-themes-comment-colors~.
+
+#+begin_src emacs-lisp
+(defvar my-modus-themes-comment-colors
+  ;; We are abusing the palette here, as those colors have their own
+  ;; purpose in the palette, so please ignore the semantics of their
+  ;; names.
+  '((low . bg-region)
+    (medium . bg-tab-inactive-alt)
+    (high . fg-alt))
+  "Alist of levels of intensity mapped to color palette entries.
+The entries are found in `modus-themes-operandi-colors' or
+`modus-themes-vivendi-colors'.")
+
+(defvar my-modus-themes--adjust-comment-color-state nil
+  "The cyclic state of `my-modus-themes-adjust-comment-color'.
+For internal use.")
+
+(defun my-modus-themes--comment-foreground (degree state)
+  "Set `font-lock-comment-face' foreground.
+Use `my-modus-themes-comment-colors' to extract the color value
+for each level of intensity.
+
+This is complementary to `my-modus-themes-adjust-comment-color'."
+  (let ((palette-colors my-modus-themes-comment-colors))
+    (set-face-foreground
+     'font-lock-comment-face
+     (modus-themes-color (alist-get degree palette-colors)))
+    (setq my-modus-themes--adjust-comment-color-state state)
+    (message "Comments are set to %s contrast" degree)))
+
+(defun my-modus-themes-adjust-comment-color ()
+  "Cycle through levels of intensity for comments.
+The levels are determined by `my-modus-themes-comment-colors'."
+  (interactive)
+  (pcase my-modus-themes--adjust-comment-color-state
+    ('nil
+     (my-modus-themes--comment-foreground 'low 1))
+    (1
+     (my-modus-themes--comment-foreground 'medium 2))
+    (_
+     (my-modus-themes--comment-foreground 'high nil))))
+#+end_src
+
+With the above, {{{kbd(M-x my-modus-themes-adjust-comment-color)}}} will cycle
+through the three levels of intensity that have been specified.
+
+Another approach is to not read from the active theme's color palette
+and instead provide explicit color values, either in hexadecimal RGB
+notation (like =#123456=) or as the names that are displayed in the output
+of {{{kbd(M-x list-colors-display)}}}.  In this case, the alist with the
+colors will have to account for the active theme, so as to set the
+appropriate colors.  While this introduces a bit more complexity, it
+ultimately offers greater flexibility on the choice of colors for such a
+niche functionality (so there is no need to abuse the palette of the
+active Modus theme):
+
+#+begin_src emacs-lisp
+(defvar my-modus-themes-comment-colors
+  '((light . ((low . "gray75")
+              (medium . "gray50")
+              (high . "#505050")))      ; the default for `modus-operandi'
+
+    (dark . ((low . "gray25")
+             (medium . "gray50")
+             (high . "#a8a8a8"))))      ; the default for `modus-vivendi'
+  "Alist of levels of intensity mapped to color values.
+For such colors, consult the command `list-colors-display'.  Pass
+the name of a color or its hex value.")
+
+(defvar my-modus-themes--adjust-comment-color-state nil
+  "The cyclic state of `my-modus-themes-adjust-comment-color'.
+For internal use.")
+
+(defun my-modus-themes--comment-foreground (degree state)
+    "Set `font-lock-comment-face' foreground.
+Use `my-modus-themes-comment-colors' to extract the color value
+for each level of intensity.
+
+This is complementary to `my-modus-themes-adjust-comment-color'."
+  (let* ((colors my-modus-themes-comment-colors)
+         (levels (pcase (car custom-enabled-themes)
+                   ('modus-operandi (alist-get 'light colors))
+                   ('modus-vivendi (alist-get 'dark colors)))))
+    (set-face-foreground
+     'font-lock-comment-face
+     (alist-get degree levels))
+    (setq my-modus-themes--adjust-comment-color-state state)
+    (message "Comments are set to %s contrast" degree)))
+
+(defun my-modus-themes-adjust-comment-color ()
+  "Cycle through levels of intensity for comments.
+The levels are determined by `my-modus-themes-comment-colors'."
+  (interactive)
+  (pcase my-modus-themes--adjust-comment-color-state
+    ('nil
+     (my-modus-themes--comment-foreground 'low 1))
+    (1
+     (my-modus-themes--comment-foreground 'medium 2))
+    (_
+     (my-modus-themes--comment-foreground 'high nil))))
+#+end_src
+
+The effect of the above configurations on ~font-lock-comment-face~ is
+global.  To make it buffer-local, one must tweak the code to employ the
+function ~face-remap-add-relative~ 
([[#h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f][Remap face with local value]]).
+
+So this form in ~my-modus-themes--comment-foreground~:
+
+#+begin_src emacs-lisp
+;; example 1
+(...
+ (set-face-foreground
+  'font-lock-comment-face
+  (modus-themes-color (alist-get degree palette-colors)))
+ ...)
+
+;; example 2
+(...
+ (set-face-foreground
+  'font-lock-comment-face
+  (alist-get degree levels))
+ ...)
+#+end_src
+
+Must become this:
+
+#+begin_src emacs-lisp
+;; example 1
+(...
+ (face-remap-add-relative
+  'font-lock-comment-face
+  `(:foreground ,(modus-themes-color (alist-get degree palette-colors))))
+ ...)
+
+;; example 2
+(...
+ (face-remap-add-relative
+  'font-lock-comment-face
+  `(:foreground ,(alist-get degree levels)))
+ ...)
+#+end_src
+
 ** Override colors (DIY)
 :properties:
 :custom_id: h:307d95dd-8dbd-4ece-a543-10ae86f155a6
@@ -1659,7 +1962,7 @@ basic background values that apply to buffers and the 
mode line
 that can be overridden):
 
 #+begin_src emacs-lisp
-(defconst modus-themes-colors-operandi
+(defconst modus-themes-operandi-colors
   '((bg-main . "#ffffff")
     (bg-dim . "#f8f8f8")
     (bg-alt . "#f0f0f0")
@@ -1808,9 +2111,59 @@ same for ~modus-themes-vivendi-color-overrides~ (dark 
theme).
 Using the above has an immediate effect, as it reloads the active Modus
 theme.
 
-To disable the effect, one must reset the aforementioned variables to
-~nil~.  Or specify a command for it, such as by taking inspiration from
-the ~modus-themes-toggle~ we already provide:
+The =my-modus-themes-saturate= function stores new color values in the
+variables =modus-themes-operandi-color-overrides= and
+=modus-themes-vivendi-color-overrides=, meaning that it undoes changes
+implemented by the user on individual colors.  To have both automatic
+saturation adjustment across the board and retain per-case edits to the
+palette, some tweaks to the above function are required.  For example:
+
+#+begin_src emacs-lisp
+(defvar my-modus-themes-vivendi-extra-color-overrides
+  '((fg-main . "#ead0c0")
+    (bg-main . "#050515"))
+  "My bespoke colors for `modus-vivendi'.")
+
+(defvar my-modus-themes-operandi-extra-color-overrides
+  '((fg-main . "#1a1a1a")
+    (bg-main . "#fefcf4"))
+  "My bespoke colors for `modus-operandi'.")
+
+(defun my-modus-themes-saturate (percent)
+  "Saturate current Modus theme palette overrides by PERCENT.
+Preserve the color values stored in
+`my-modus-themes-operandi-extra-color-overrides',
+`my-modus-themes-vivendi-extra-color-overrides'."
+  (interactive
+   (list (read-number "Saturation by percent: ")))
+  (let* ((theme (modus-themes--current-theme))
+         (palette (pcase theme
+                    ('modus-operandi modus-themes-operandi-colors)
+                    ('modus-vivendi modus-themes-vivendi-colors)
+                    (_ (error "No Modus theme is active"))))
+         (overrides (pcase theme
+                      ('modus-operandi 'modus-themes-operandi-color-overrides)
+                      ('modus-vivendi 'modus-themes-vivendi-color-overrides)
+                      (_ (error "No Modus theme is active"))))
+         (extra-overrides (pcase theme
+                            ('modus-operandi 
my-modus-themes-operandi-extra-color-overrides)
+                            ('modus-vivendi 
my-modus-themes-vivendi-extra-color-overrides)
+                            (_ (error "No Modus theme is active")))))
+    (let (name cons colors)
+      (dolist (cons palette)
+        (setq name (color-saturate-name (cdr cons) percent))
+        (setq name (format "%s" name))
+        (setq cons `(,(car cons) . ,name))
+        (push cons colors))
+      (set overrides (append extra-overrides colors)))
+    (pcase theme
+      ('modus-operandi (modus-themes-load-operandi))
+      ('modus-vivendi (modus-themes-load-vivendi)))))
+#+end_src
+
+To disable the effect, one must reset the aforementioned variables of
+the themes to ~nil~.  Or specify a command for it, such as by taking
+inspiration from the ~modus-themes-toggle~ we already provide:
 
 #+begin_src emacs-lisp
 (defun my-modus-themes-revert-overrides ()
@@ -1959,6 +2312,48 @@ it if you plan to control face attributes.
 
 [[#h:02e25930-e71a-493d-828a-8907fc80f874][Check color combinations]].
 
+** Update Org block delimiter fontification (DIY)
+:properties:
+:custom_id: h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50
+:end:
+
+As noted in the section about ~modus-themes-org-blocks~, Org contains a
+variable that determines whether the block's begin and end lines are
+extended to the edge of the window 
([[#h:b7e328c0-3034-4db7-9cdf-d5ba12081ca2][Option for org-mode block styles]]).
+The variable is ~org-fontify-whole-block-delimiter-line~.
+
+Users who change the style of Org blocks from time to time may prefer to
+automatically update delimiter line fontification, such as with the
+following setup:
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-org-fontify-block-delimiter-lines ()
+  "Match `org-fontify-whole-block-delimiter-line' to theme style.
+Run this function at the post theme load phase, such as with the
+`modus-themes-after-load-theme-hook'."
+  (if (eq modus-themes-org-blocks 'gray-background)
+      (setq org-fontify-whole-block-delimiter-line t)
+    (setq org-fontify-whole-block-delimiter-line nil)))
+
+(add-hook 'modus-themes-after-load-theme-hook
+          #'my-modus-themes-org-fontify-block-delimiter-lines)
+#+end_src
+
+Then {{{kbd(M-x org-mode-restart)}}} for changes to take effect, though manual
+intervention can be circumvented by tweaking the function thus:
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-org-fontify-block-delimiter-lines ()
+  "Match `org-fontify-whole-block-delimiter-line' to theme style.
+Run this function at the post theme load phase, such as with the
+`modus-themes-after-load-theme-hook'."
+  (if (eq modus-themes-org-blocks 'gray-background)
+      (setq org-fontify-whole-block-delimiter-line t)
+    (setq org-fontify-whole-block-delimiter-line nil))
+  (when (derived-mode-p 'org-mode)
+    (font-lock-flush)))
+#+end_src
+
 ** Measure color contrast (DIY)
 :properties:
 :custom_id: h:02e25930-e71a-493d-828a-8907fc80f874
@@ -2032,7 +2427,7 @@ minutia and relevant commentary.
 Such knowledge may prove valuable while attempting to override some of
 the themes' colors: [[#h:307d95dd-8dbd-4ece-a543-10ae86f155a6][Override 
colors]].
 
-** Load theme depending on time of day
+** Load theme depending on time of day (DIY)
 :properties:
 :custom_id: h:1d1ef4b4-8600-4a09-993c-6de3af0ddd26
 :end:
@@ -2210,6 +2605,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + bm
 + bongo
 + boon
++ bookmark
 + breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library)
 + buffer-expose
 + calendar and diary
@@ -2229,7 +2625,6 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + corfu
 + counsel*
 + counsel-css
-+ counsel-notmuch
 + counsel-org-capture-string
 + cov
 + cperl-mode
@@ -2372,7 +2767,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + minibuffer-line
 + minimap
 + mmm-mode
-+ modeline
++ mode-line
 + mood-line
 + moody
 + mpdel
@@ -2475,8 +2870,8 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + tuareg
 + typescript
 + undo-tree
-+ vc (built-in mode line status for version control)
-+ vc-annotate (the out put of {{{kbd(C-x v g)}}})
++ vc (vc-dir.el, vc-hooks.el)
++ vc-annotate (the output of {{{kbd(C-x v g)}}})
 + vdiff
 + vertico
 + vimish-fold
@@ -2511,8 +2906,10 @@ GNU Emacs distribution.
 #+cindex: Implicitly supported packages
 
 These do not require any extra styles because they are configured to
-inherit from some basic faces.  Please confirm.
+inherit from some basic faces or their dependencies which are directly
+supported by the themes.
 
++ counsel-notmuch
 + edit-indirect
 + evil-owl
 + fortran-mode
@@ -2524,7 +2921,7 @@ inherit from some basic faces.  Please confirm.
 + swift-mode
 + tab-bar-echo-area
 
-* Notes for individual packages
+* Notes on individual packages
 :properties:
 :custom_id: h:4c4d901a-84d7-4f20-bd99-0808c2b06eba
 :end:
@@ -2532,7 +2929,22 @@ inherit from some basic faces.  Please confirm.
 This section covers information that may be of interest to users of
 individual packages.
 
-** Note for dimmer.el
+** Note on inline Latex in Org buffers
+:properties:
+:custom_id: h:dd8478da-f56a-45cd-b199-b836c85c3c5a
+:end:
+
+Org can work with inline latex and related syntax.  To actually fontify
+those constructs, set the variable ~org-highlight-latex-and-related~ to
+the desired list of values (per its doc string).  For example:
+
+#+begin_src emacs-lisp
+(setq org-highlight-latex-and-related '(latex script))
+#+end_src
+
+Remember to use {{{kbd(M-x org-mode-restart)}}} for changes to take effect.
+
+** Note on dimmer.el
 :properties:
 :custom_id: h:8eb4b758-d318-4480-9ead-357a571beb93
 :end:
@@ -2568,7 +2980,7 @@ other value for that variable will turn the main 
background gray.  This
 inadvertently leads to the opposite of the intended utility of this
 package: it draws too much attention to unfocused windows.
 
-** Note for display-fill-column-indicator-mode
+** Note on display-fill-column-indicator-mode
 :properties:
 :custom_id: h:2a602816-bc1b-45bf-9675-4cbbd7bf6cab
 :end:
@@ -2600,7 +3012,7 @@ and have the foreground be indistinguishable from it.  
For example:
 
 [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the 
themes' palette]].
 
-** Note for mmm-mode.el background colors
+** Note on mmm-mode.el background colors
 :properties:
 :custom_id: h:99cf0d6c-e478-4e26-9932-3bf3427d13f6
 :end:
@@ -2650,7 +3062,7 @@ very high cost of degraded legibility.
    `(mmm-special-submode-face ((,class :background ,green-refine-bg)))))
 #+end_src
 
-** Note for prism.el
+** Note on prism.el
 :properties:
 :alt_title: Note for prism
 :custom_id: h:a94272e0-99da-4149-9e80-11a7e67a2cf2
@@ -2746,6 +3158,42 @@ examples with the 4, 8, 16 colors):
                   magenta)))
 #+end_src
 
+** Note on god-mode.el
+:properties:
+:alt_title: Note for god-mode
+:custom_id: h:4da1d515-3e05-47ef-9e45-8251fc7e986a
+:end:
+
+The ~god-mode~ library does not provide faces that could be configured by
+the Modus themes.  Users who would like to get some visual feedback on
+the status of {{{kbd(M-x god-mode)}}} are instead encouraged by upstream to
+set up their own configurations, such as by changing the ~mode-line~ face
+([[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization 
(do-it-yourself)]]).  This is an adaptation of the
+approach followed in the upstream README:
+
+#+begin_src emacs-lisp
+(defun my-god-mode-update-mode-line ()
+  "Make `mode-line' blue if God local mode is active."
+  (modus-themes-with-colors
+    (if god-local-mode
+        (set-face-attribute 'mode-line nil
+                            :foreground blue-active
+                            :background bg-active-accent
+                            :box blue)
+      (set-face-attribute 'mode-line nil
+                          :foreground fg-active
+                          :background bg-active
+                          :box fg-alt))))
+
+(add-hook 'post-command-hook 'my-god-mode-update-mode-line)
+#+end_src
+
+We employ the ~modus-themes-with-colors~ which provides access to color
+variables defined by the active theme.  Its use is covered elsewhere in
+this manual ([[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale 
using the themes' palette]]).  As for the
+attributes that can be passed to each face, start by consulting the
+documentation string of ~set-face-attribute~.
+
 ** Note on company-mode overlay pop-up
 :properties:
 :custom_id: h:20cef8c4-d11f-4053-8b2c-2872925780b1
@@ -2762,7 +3210,7 @@ instead of overlays.[fn::
 https://github.com/company-mode/company-mode/issues/1010][fn::
 https://github.com/tumashu/company-posframe/]
 
-** Note for ERC escaped color sequences
+** Note on ERC escaped color sequences
 :properties:
 :custom_id: h:98bdf319-1e32-4469-8a01-771200fba65c
 :end:
@@ -2795,14 +3243,14 @@ accessibility standard of the themes:
 Colors 0 and 1 are white and black respectively.  So combine them
 together, if you must.
 
-** Note for powerline or spaceline
+** Note on powerline or spaceline
 :properties:
 :custom_id: h:9130a8ba-d8e3-41be-a58b-3cb1eb7b6d17
 :end:
 
 Both Powerline and Spaceline package users will likely need to use the
 command ~powerline-reset~ whenever they make changes to their themes
-and/or modeline setup.
+and/or mode line setup.
 
 ** Note on SHR colors
 :properties:
@@ -2815,8 +3263,7 @@ specifications the webpage provides.
 
 Consult {{{kbd(C-h v shr-use-colors)}}}.
 
-
-** Note for EWW and Elfeed fonts (SHR fonts)
+** Note on EWW and Elfeed fonts (SHR fonts)
 :properties:
 :custom_id: h:e6c5451f-6763-4be7-8fdb-b4706a422a4c
 :end:
@@ -2830,7 +3277,7 @@ default font family is.  Its default value is non-nil, 
which means that
 
 [[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and 
others]].
 
-** Note for Helm grep
+** Note on Helm grep
 :properties:
 :custom_id: h:d28879a2-8e4b-4525-986e-14c0f873d229
 :end:
@@ -2930,6 +3377,217 @@ you've customized any faces.
             "-draw"       "text %X,%Y '%c'"))))
 #+end_src
 
+* Frequently Asked Questions (FAQ)
+:properties:
+:custom_id: h:b3384767-30d3-4484-ba7f-081729f03a47
+:end:
+#+cindex: Frequently Asked Questions (FAQ)
+
+In this section we provide answers related to some aspects of the Modus
+themes' design and application.
+
+** Is the contrast ratio about adjacent colors?
+:properties:
+:custom_id: h:5ce7ae2e-9348-4e55-b4cf-9302345b1826
+:end:
+#+cindex: Contrast between adjacent colors
+
+The minimum contrast ratio in relative luminance that the themes conform
+with always refers to any given combination of background and foreground
+colors.  If we have some blue colored text next to a magenta one, both
+against a white background, we do not mean to imply that blue:magenta is
+7:1 in terms of relative luminance.  Rather, we state that blue:white
+and magenta:white each are 7:1 or higher.
+
+The point of reference is always the background.  Because colors have
+about the same minimum distance in luminance from their backdrop, they
+necessarily are fairly close to each other in this measure.  A possible
+blue:magenta combination would naturally be around 1:1 in contrast of
+the sort here considered.
+
+To differentiate between sequential colors, we rely on hueness by
+mapping contrasting hues to adjacent constructs, while avoiding
+exaggerations.  A blue next to a magenta can be told apart regardless of
+their respective contrast ratio against their common background.
+Exceptions would be tiny characters in arguably not so realistic cases,
+such as two dots drawn side-by-side which for some reason would need to
+be colored differently.  They would still be legible though, which is
+the primary objective of the Modus themes.
+
+** What does it mean to avoid exaggerations?
+:properties:
+:custom_id: h:44284e1f-fab8-4c4f-92f0-544728a7c91e
+:end:
+#+cindex: Avoiding exaggerations in design
+
+The Modus themes are designed with restraint, so that their default
+looks do not overdo it with the application of color.
+
+[[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]].
+
+This is the non-quantifiable aspect of the themes' design: the artistic
+part, if you will.  There are a lot of cases where color can be used
+inconsiderately, without accounting for layout, typographic, or other
+properties of the presentation.  For example, two headings with distinct
+markers, such as leading asterisks in Org buffers, do not have to have
+highly contrasting hues between them in order to be told apart: the
+added element of contrast in hueness does not contribute significantly
+more to the distinction between the headings than colors whose hues are
+relatively closer to each other in the color space.
+
+Exaggerations can be hard to anticipate or identify.  Multiple shades of
+blue and magenta in the same context may not seem optimal: one might
+think that it would be better to use highly contrasting hues to ensure
+that all colors stand out, such as by placing blue next to yellow, next
+to magenta, and green.  That would, however, be a case of design for its
+own sake; a case where color is being applied without consideration of
+its end results in the given context.  Too many contrasting hues in
+close proximity force an erratic rate to how the eye jumps from one
+piece of text to the next.  Whereas multiple shades of, say, blue and
+magenta can suffice to tell things apart and avoid excess coloration: a
+harmonious rhythm.
+
+** Why are colors mostly variants of blue, magenta, cyan?
+:properties:
+:custom_id: h:0b26cb47-9733-4cb1-87d9-50850cb0386e
+:end:
+#+cindex: Innate color qualities of the palette
+
+Due to the innate properties of color, some options are better than
+others for the accessibility purposes of the themes, the stylistic
+consistency between ~modus-operandi~ and ~modus-vivendi~, and the avoidance
+of exaggerations in design.
+
+[[#h:44284e1f-fab8-4c4f-92f0-544728a7c91e][What does it mean to avoid 
exaggerations?]]
+
+What we describe as color is a function of three distinct channels of
+light: red, green, blue.  In hexadecimal RGB notation, a color value is
+read as three pairs of red, green, and blue light: =#RRGGBB=.  Of those
+three, the most luminant is green, while the least luminant is blue.
+
+The three basic colors represent each of the channels of light.  They
+can be intermixed to give us six colors: red and green derive yellow,
+green and blue make cyan, red and blue turn into magenta.
+
+We can test the luminance of each of those against white and black to
+get a sense of how not all colors are equally good for accessibility
+(white is =#ffffff=, which means that all three light channels are fully
+luminated, while black is =#000000= meaning that no light is present
+(notwithstanding display technology)).
+
+#+begin_example
+| Name    |         | #ffffff | #000000 |
+|---------+---------+---------+---------|
+| red     | #ff0000 |    4.00 |    5.25 |
+| yellow  | #ffff00 |    1.07 |   19.56 |
+| green   | #00ff00 |    1.37 |   15.30 |
+| cyan    | #00ffff |    1.25 |   16.75 |
+| blue    | #0000ff |    8.59 |    2.44 |
+| magenta | #ff00ff |    3.14 |    6.70 |
+#+end_example
+
+[[#h:02e25930-e71a-493d-828a-8907fc80f874][Measure color contrast]].
+
+By reading this table we learn that every color that has a high level of
+green light (green, yellow, cyan) is virtually unreadable against a
+white background and, conversely, can be easily read against black.
+
+We can then infer that red and blue, in different combinations, with
+green acting as calibrator for luminance, will give us fairly moderate
+colors that pass the 7:1 target.  Blue with a bit of green produce
+appropriate variants of cyan.  Similarly, blue combined with some red
+and hints of green give us suitable shades of purple.
+
+Due to the need of maintaining some difference in hueness between
+adjacent colors, it is not possible to make red, green, and yellow the
+primary colors, because blue could not be used to control their
+luminance and, thus the relevant space would shrink considerably.
+
+[[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about 
adjacent colors?]]
+
+This phenomenon is best illustrated by the following table that measures
+the relative luminance of shades of red, yellow, magenta against white:
+
+#+begin_example
+|         | #ffffff |
+|---------+---------|
+| #990000 |    8.92 |
+| #995500 |    5.75 |
+| #990099 |    7.46 |
+#+end_example
+
+We notice that equal values of red and blue light in =#990099= (magenta
+shade) do not lead to a considerable change in luminance compared with
+=#990000= (red variant).  Whereas less amount of green light in =#995500=
+leads to a major drop in luminance relative to white.  It follows that
+using the green channel of light to calibrate the luminance of colors is
+more effective than trying to do the same with either red or blue (the
+latter is the least effective in that regard).
+
+When we need to work with several colors, it is always better to have
+sufficient manoeuvring space, especially since we cannot pick arbitrary
+colors but only those that satisfy the accessibility objectives of the
+themes.
+
+As for why we do not mostly use green, yellow, cyan for the dark theme,
+it is because those colors are far more luminant than their counterparts
+on the other side of the spectrum, so to ensure that they all have about
+the same contrast ratios we would have to alter their hueness
+considerably.  In short, the effect would not be optimal as it would
+lead to exaggerations.  Plus, it would make ~modus-vivendi~ look
+completely different than ~modus-operandi~, to the effect that the two
+could not be properly considered part of the same project.
+
+** What is the best setup for legibility?
+:properties:
+:custom_id: h:f60cc2ae-129d-47c0-9849-4f6bbd87d8be
+:end:
+#+cindex: General setup for readability
+
+The Modus themes can be conceptually simplified as combinations of color
+values that account for relative luminance and inner harmony.  Those
+qualities do not guarantee that every end-user will have the same
+experience, due to differences between people, but also because of
+variances in hardware capabilities and configurations.  For the purposes
+of this document, we may only provide suggestions pertaining to the
+latter case.
+
+~modus-operandi~ is best used outdoors or in a room that either gets
+direct sunlight or has plenty of light.  Whereas ~modus-vivendi~ works
+better when there is not a lot of sunshine or the room has a source of
+light, preferably a faint or warm one.  It is possible to use
+~modus-operandi~ at night and ~modus-vivendi~ during the day, though that
+will depend on several variables, such as one's overall perception of
+color, the paint on the walls and how that contributes to the impression
+of lightness in the room, the sense of space within the eye's peripheral
+vision, hardware specifications, and environmental factors.
+
+In general, an additional source of light other than that of the monitor
+can help reduce eye strain: the eyes are more relaxed when they do not
+have to focus on one point to gather light.
+
+The monitor's display settings must be accounted for.  Gamma ray values,
+in particular, need to be calibrated to neither amplify nor distort the
+perception of black.  Same principle for sharpness, brightness, and
+contrast as determined by the hardware, which all have an effect on how
+text is read on the screen.
+
+There are software level methods on offer, such as the XrandR utility
+for the X Window System (X.org), which can make gamma corrections for
+each of the three channels of light (red, green, blue).  For example:
+
+: xrandr --output LVDS1 --brightness 1.0 --gamma 0.76:0.75:0.68
+
+Typography is another variable.  Some font families are blurry at small
+point sizes.  Others may have a regular weight that is lighter (thiner)
+than that of their peers which may, under certain circumstances, cause a
+halo effect around each glyph.
+
+The gist is that legibility cannot be fully solved at the theme level.
+The color combinations may have been optimized for accessibility, though
+the remaining contributing factors in each case need to be considered in
+full.
+
 * Contributing
 :properties:
 :custom_id: h:9c3cd842-14b7-44d7-84b2-a5c8bc3fc3b1
@@ -3056,10 +3714,10 @@ The Modus themes are a collective effort.  Every bit of 
work matters.
 + Author/maintainer :: Protesilaos Stavrou.
 
 + Contributions to code or documentation :: Anders Johansson, Basil
-  L.{{{space()}}} Contovounesios, Carlo Zancanaro, Eli Zaretskii, Kostadin
-  Ninev, Madhavan Krishnan, Markus Beppler, Matthew Stevenson, Mauro
-  Aranda, Nicolas De Jaeghere, Shreyas Ragavan, Stefan Kangas, Vincent
-  Murphy, Xinglu Chen.
+  L.{{{space()}}} Contovounesios, Carlo Zancanaro, Eli Zaretskii, Fritz Grabo,
+  Kostadin Ninev, Madhavan Krishnan, Markus Beppler, Matthew Stevenson,
+  Mauro Aranda, Nicolas De Jaeghere, Rudolf Adamkovič, Shreyas Ragavan,
+  Stefan Kangas, Vincent Murphy, Xinglu Chen.
 
 + Ideas and user feedback :: Aaron Jensen, Adam Spiers, Adrian Manea,
   Alex Griffin, Alex Peitsinis, Alexey Shmalko, Alok Singh, Anders
@@ -3073,12 +3731,13 @@ The Modus themes are a collective effort.  Every bit of 
work matters.
   Ninev, Len Trigg, Manuel Uberti, Mark Burton, Markus Beppler, Mauro
   Aranda, Michael Goldenberg, Morgan Smith, Murilo Pereira, Nicky van
   Foreest, Nicolas De Jaeghere, Paul Poloskov, Pete Kazmier, Peter Wu,
-  Philip K., Pierre Téchoueyres, Roman Rudakov, Ryan Phillips, Sam
-  Kleinman, Shreyas Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron,
-  Trey Merkley, Togan Muftuoglu, Toon Claes, Uri Sharf, Utkarsh Singh,
-  Vincent Foley.  As well as users: Ben, CsBigDataHub1, Emacs Contrib,
-  Eugene, Fourchaux, Fredrik, Moesasji, Nick, TheBlob42, Trey,
-  bepolymathe, doolio, fleimgruber, iSeeU, jixiuf, okamsn, pRot0ta1p.
+  Philip K., Pierre Téchoueyres, Roman Rudakov, Ryan Phillips, Rudolf
+  Adamkovič, Sam Kleinman, Shreyas Ragavan, Simon Pugnet, Tassilo Horn,
+  Thibaut Verron, Trey Merkley, Togan Muftuoglu, Toon Claes, Uri Sharf,
+  Utkarsh Singh, Vincent Foley.  As well as users: Ben, CsBigDataHub1,
+  Emacs Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, TheBlob42,
+  Trey, bepolymathe, doolio, fleimgruber, iSeeU, jixiuf, okamsn,
+  pRot0ta1p.
 
 + Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii, Glenn
   Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core Emacs),
diff --git a/doc/misc/rcirc.texi b/doc/misc/rcirc.texi
index ff8133b..e187bbb 100644
--- a/doc/misc/rcirc.texi
+++ b/doc/misc/rcirc.texi
@@ -590,6 +590,12 @@ Use this symbol if you need to identify yourself in the 
Bitlbee channel
 as follows: @code{identify secret}.  The necessary arguments are the
 nickname you want to use this for, and the password to use.
 
+@item sasl
+@cindex sasl authentication
+Use this symbol if you want to use @acronym{SASL} authentication.  The
+necessary arguments are the nickname you want to use this for, and the
+password to use.
+
 @cindex gateway to other IM services
 @cindex instant messaging, other services
 @cindex Jabber
diff --git a/doc/misc/reftex.texi b/doc/misc/reftex.texi
index f1074d3..88ca445 100644
--- a/doc/misc/reftex.texi
+++ b/doc/misc/reftex.texi
@@ -4609,7 +4609,7 @@ Footer to insert in BibTeX files generated by
 @end defopt
 
 
-@node Options - Index Support, Options - Viewing Cross-References, Options - 
Creating Citations,  Options
+@node Options - Index Support
 @section Index Support
 @cindex Options, Index support
 @cindex Index support, options
diff --git a/doc/misc/todo-mode.texi b/doc/misc/todo-mode.texi
index dbd7f3d..b3ea652 100644
--- a/doc/misc/todo-mode.texi
+++ b/doc/misc/todo-mode.texi
@@ -122,7 +122,7 @@ Todo Display Features
 @end detailmenu
 @end menu
 
-@node Overview, Todo Mode Entry Points, Top, Top
+@node Overview
 @chapter Overview
 
 The Todo mode package provides facilities for making and maintaining
@@ -146,7 +146,7 @@ most important differences, @ref{Legacy Todo Mode Files}.
 * Todo Items as Diary Entries::
 @end menu
 
-@node Levels of Organization, Todo Items as Diary Entries, , Overview
+@node Levels of Organization
 @section Levels of Organization
 
 In Todo mode each todo list is identified with a named category, so you
@@ -184,7 +184,7 @@ associating various kinds of metadata with it, e.g., the 
category it
 belongs to, its priority, whether it is to be included in the Emacs
 diary, date and time stamps, whether it is done or still to do.
 
-@node Todo Items as Diary Entries, , Levels of Organization, Overview
+@node Todo Items as Diary Entries
 @section Todo Items as Diary Entries
 
 You can have todo items show up in the Emacs Fancy Diary display by
@@ -213,7 +213,7 @@ from a Todo mode file, clicking or typing @key{RET} on this 
item will
 switch to the buffer visiting that file and properly display the item's
 category, with point on the item.
 
-@node Todo Mode Entry Points, Key Binding Conventions, Overview, Top
+@node Todo Mode Entry Points
 @chapter Todo Mode Entry Points
 
 To initialize your first todo file, invoke the command @code{todo-show}.
@@ -275,7 +275,7 @@ that was displayed on quitting current for subsequent Todo 
mode commands
 category in Todo mode, in which case the latter become current for Todo
 mode commands).
 
-@node Key Binding Conventions, Navigation, Todo Mode Entry Points, Top
+@node Key Binding Conventions
 @chapter Key Binding Conventions
 
 For Todo mode commands to function properly, it is essential to maintain
@@ -301,7 +301,7 @@ those beginning with @kbd{A} apply to archives (a special 
type of Todo
 file; @ref{Todo Archive Mode}).  Todo commands applying to items,
 which constitute the majority, are bound to lower case key sequences.
 
-@node Navigation, Editing, Key Binding Conventions, Top
+@node Navigation
 @chapter Navigation
 
 The navigation commands are for making another todo file, category, or
@@ -389,7 +389,7 @@ or higher than the current one.
 Navigation to other types of Todo files is discussed in the relevant
 sections below.
 
-@node Editing, Todo Archives, Navigation, Top
+@node Editing
 @chapter Editing
 
 Editing in Todo mode means making structural or textual changes at one
@@ -412,7 +412,7 @@ Todo mode with @kbd{q}.
 * Item Editing::
 @end menu
 
-@node File Editing, Category Editing, , Editing
+@node File Editing
 @section File Editing and Todo Edit Mode
 
 There are four file-level editing commands:
@@ -470,7 +470,7 @@ containing inconsistent information (see the cautionary 
note in
 displays a warning to this effect.
 @end table
 
-@node Category Editing, Item Editing, File Editing, Editing
+@node Category Editing
 @section Category Editing
 
 The following commands are available for editing specifically at the
@@ -520,7 +520,7 @@ i.e., typing @kbd{C-u C g}, prompts for a file and confines 
merging to a
 category in that file.
 @end table
 
-@node Item Editing, , Category Editing, Editing
+@node Item Editing
 @section Item Editing
 
 Todo mode provides commands for adding new items as well as textually
@@ -534,7 +534,7 @@ you a lot of flexibility to fine-tune these operations to 
your needs.
 * Relocating and Removing Items::
 @end menu
 
-@node  Inserting New Items, Editing Item Headers and Text, , Item Editing
+@node  Inserting New Items
 @subsection Inserting New Items
 
 To add a new todo item to a category, type @kbd{i}, which is bound to
@@ -761,7 +761,7 @@ calendar after you have entered the item's text, and then 
you can
 choose a date from the calendar.)
 
 
-@node  Editing Item Headers and Text, Relocating and Removing Items, Inserting 
New Items, Item Editing
+@node  Editing Item Headers and Text
 @subsection Editing Item Headers and Text
 
 To make changes to an existing item's content or header, type @kbd{e},
@@ -945,7 +945,7 @@ really want to toggle the diary-inclusion and 
calendar-marking status
 of all items in the category, you can do this by marking all the items
 and then invoking @kbd{e y} or @kbd{e k}, @pxref{Marked Items}).
 
-@node  Relocating and Removing Items,  , Editing Item Headers and Text, Item 
Editing
+@node  Relocating and Removing Items
 @subsection Relocating and Removing Items
 
 In addition to inserting a new todo item and changing the text or header
@@ -960,7 +960,7 @@ removes it from the todo list but does not delete it.
 * Done Items::
 @end menu
 
-@node Reprioritizing Items, Moving and Deleting Items, , Relocating and 
Removing Items
+@node Reprioritizing Items
 @subsubsection Reprioritizing Items
 
 There are three ways to change a todo item's priority:
@@ -986,7 +986,7 @@ highest priority without prompting.  (Prefix arguments have 
no effect
 with @kbd{r} or @kbd{l}.)
 @end table
 
-@node Moving and Deleting Items, Done Items, Reprioritizing Items, Relocating 
and Removing Items
+@node Moving and Deleting Items
 @subsubsection Moving and Deleting Items
 
 You can move an item to another category, thereby recategorizing it:
@@ -1032,7 +1032,7 @@ Todo command to undo a deletion.  If you want to be able 
to use @key{SPC} for
 confirmation, enable the option @code{todo-y-with-space}.
 @end quotation
 
-@node Done Items, , Moving and Deleting Items, Relocating and Removing Items
+@node Done Items
 @subsubsection Done Items
 
 When the activity or thing that a todo item is about has been done, it
@@ -1118,7 +1118,7 @@ item has a comment, you are asked whether to delete it 
from the restored
 item.
 @end table
 
-@node Todo Archives, Marked Items, Editing, Top
+@node Todo Archives
 @chapter Todo Archives
 
 When the done items section of a category itself starts to become
@@ -1134,7 +1134,7 @@ the extension @samp{.toda} instead of @samp{.todo}.
 * Todo Archive Mode::
 @end menu
 
-@node Creating and Visiting Archives, Todo Archive Mode, , Todo Archives
+@node Creating and Visiting Archives
 @section Creating and Visiting Archives
 
 Todo mode provides the following command for archiving items:
@@ -1207,7 +1207,7 @@ As with todo files, you can also visit a Todo archive by 
invoking a
 standard Emacs file-visiting command; this displays the first (on the
 initial invocation) or current category of the archive.
 
-@node Todo Archive Mode, , Creating and Visiting Archives, Todo Archives
+@node Todo Archive Mode
 @section Todo Archive Mode
 
 When you visit a Todo archive, the buffer is in Todo Archive mode.  It
@@ -1264,7 +1264,7 @@ The command @kbd{F k} (@pxref{File Editing}) is also 
available in Todo
 Archive mode.  It deletes the current archive file and prompts you
 whether to delete the corresponding todo file.
 
-@node Marked Items, Todo Categories Mode, Todo Archives, Top
+@node Marked Items
 @chapter Marked Items
 
 For many item editing commands it can make sense and be convenient to
@@ -1329,7 +1329,7 @@ todo or marked done items, so if both types of items are 
marked,
 invoking these commands has no effect and informs you of your
 erroneous attempt.
 
-@node Todo Categories Mode, Searching for Items, Marked Items, Top
+@node Todo Categories Mode
 @chapter Todo Categories Mode
 
 It can be helpful to have a compact overview of the categories in a
@@ -1367,7 +1367,7 @@ to visit another todo file).  To do this customize the 
option
 * Reordering Categories::
 @end menu
 
-@node Table of Item Counts, Reordering Categories, , Todo Categories Mode
+@node Table of Item Counts
 @section Table of Item Counts
 
 Above each column of the table is a labeled button you can press by
@@ -1428,7 +1428,7 @@ Typing @kbd{q} exits Todo Categories mode, killing the 
buffer and returning
 to the current category in the Todo mode or Todo Archive mode buffer
 from which you had invoked @kbd{F c}.
 
-@node Reordering Categories, , Table of Item Counts, Todo Categories Mode
+@node Reordering Categories
 @section Reordering Categories
 
 Todo Categories mode provide commands with which you can change the
@@ -1479,7 +1479,7 @@ have to renumber them again.  This is one reason why you 
should
 exercise caution when using @kbd{F e}.
 @end quotation
 
-@node Searching for Items, Todo Filtered Items Mode, Todo Categories Mode, Top
+@node Searching for Items
 @chapter Searching for Items
 
 It can be useful to be able to locate and examine all todo items that
@@ -1506,7 +1506,7 @@ search and remove the highlighting later.
 
 These commands are also available in Todo Archive mode.
 
-@node Todo Filtered Items Mode, Todo Display Features, Searching for Items, Top
+@node Todo Filtered Items Mode
 @chapter Todo Filtered Items Mode
 
 A more powerful alternative to sequential searching is item filtering,
@@ -1520,7 +1520,7 @@ category in a distinct mode, Todo Filtered Items mode.
 * Files of Filtered Items::
 @end menu
 
-@node Filtering Items, Todo Filtered Items Mode Commands, , Todo Filtered 
Items Mode
+@node Filtering Items
 @section Filtering Items
 
 Todo mode provides three ways to filter items: a general filter for
@@ -1593,7 +1593,7 @@ this invocation, overriding both 
@code{todo-top-priorities-overrides} and
 @code{todo-top-priorities}.
 @end itemize
 
-@node Todo Filtered Items Mode Commands, Files of Filtered Items, Filtering 
Items, Todo Filtered Items Mode
+@node Todo Filtered Items Mode Commands
 @section Todo Filtered Items Mode Commands
 
 The output of the item filtering commands looks similar to a regular
@@ -1650,7 +1650,7 @@ change the relative priorities of items from the same 
real category,
 since that would make the filtered list inconsistent with the source
 todo list.
 
-@node Files of Filtered Items, , Todo Filtered Items Mode Commands, Todo 
Filtered Items Mode
+@node Files of Filtered Items
 @section Files of Filtered Items
 
 Typing @kbd{s} in Todo Filtered Items mode saves the buffer of filtered
@@ -1701,7 +1701,7 @@ displaying its first category, as usual.
 The command @kbd{F k} (@pxref{File Editing}) is also available in Todo
 Filtered Items mode.  It deletes the current filtered items file.
 
-@node Todo Display Features, Printing Todo Buffers, Todo Filtered Items Mode, 
Top
+@node Todo Display Features
 @chapter Todo Display Features
 
 You can change the appearance of Todo mode buffers in a variety of ways.
@@ -1712,7 +1712,7 @@ You can change the appearance of Todo mode buffers in a 
variety of ways.
 * Other Display Commands and Options::
 @end menu
 
-@node Faces, Item Prefix, , Todo Display Features
+@node Faces
 @section Faces
 
 Each of the Todo modes uses faces to distinguish various aspects of
@@ -1737,7 +1737,7 @@ The @code{todo-faces} customization group contains a 
complete list of
 Todo mode faces and brief descriptions of their use.
 
 
-@node Item Prefix, Other Display Commands and Options, Faces, Todo Display 
Features
+@node Item Prefix
 @section Item Prefix
 
 In the default display of (real or virtual) categories in Todo mode,
@@ -1776,7 +1776,7 @@ displayed in a face (@code{todo-top-priority}) different 
from the face
 of the prefix of non-top-priority items, so you see at a glance how
 many items in the category are top priorities.
 
-@node Other Display Commands and Options, , Item Prefix, Todo Display Features
+@node Other Display Commands and Options
 @section Other Display Commands and Options
 
 There are two additional toggle commands that affect display in the
@@ -1842,7 +1842,7 @@ Categories mode and Todo Filtered Items mode, beyond 
those mentioned
 above in the sections on these modes; see the customization groups
 @code{todo-categories} and @code{todo-filtered} for details.
 
-@node Printing Todo Buffers, Legacy Todo Mode Files, Todo Display Features, Top
+@node Printing Todo Buffers
 @chapter Printing Todo Buffers
 
 If you print a Todo buffer using one of the standard Emacs printing
@@ -1865,7 +1865,7 @@ By default, Todo uses @code{ps-print-buffer-with-faces} 
to make the
 printable version; you can change this by setting the option
 @code{todo-print-function}.
 
-@node Legacy Todo Mode Files, GNU Free Documentation License, Printing Todo 
Buffers, Top
+@node Legacy Todo Mode Files
 @chapter Legacy Todo Mode Files
 
 Users of the original version of Todo mode will recognize from the
@@ -1912,7 +1912,7 @@ it often).  (A delicate part of the conversion concerns 
the customizable
 format of item date/time headers in the old-style; see the documentation
 string of @code{todo-legacy-date-time-regexp} for details.)
 
-@node GNU Free Documentation License, , Legacy Todo Mode Files, Top
+@node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
 
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index ebfc14d..6ef9459 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -1261,7 +1261,7 @@ uses @file{@trampfn{mtp,,}} as the default name.
 As the name indicates, the method @option{nextcloud} allows you to
 access OwnCloud or NextCloud hosted files and directories.  Like the
 @option{gdrive} method, your credentials must be populated in your
-@command{Online Accounts} application outside Emacs. The method
+@command{Online Accounts} application outside Emacs.  The method
 supports port numbers.
 
 @item @option{sftp}
@@ -2166,7 +2166,7 @@ commands for those hosts, the property @t{"posix"} should 
be set to
 
 The default value of this property is @code{t} (not specified in
 @code{tramp-methods}).  If the remote host runs native MS Windows,
-this propery has no effect.
+this property has no effect.
 
 @item @t{"mount-point"}
 
@@ -2842,6 +2842,13 @@ auto-saved files to the same directory as the original 
file.
 Alternatively, set the user option @code{tramp-auto-save-directory}
 to direct all auto saves to that location.
 
+@vindex tramp-allow-unsafe-temporary-files
+Per default, @value{tramp} asks for confirmation if a
+@samp{root}-owned backup or auto-save remote file has to be written to
+your local temporary directory.  If you want to suppress this
+confirmation question, set user option
+@code{tramp-allow-unsafe-temporary-files} to @code{t}.
+
 
 @node Keeping files encrypted
 @section Protect remote files by encryption
@@ -3309,12 +3316,12 @@ For ad-hoc definitions to be saved automatically in
 
 Ad-hoc proxies can take patterns @code{%h} or @code{%u} like in
 @code{tramp-default-proxies-alist}.  The following file name expands
-to user @code{root} on host @code{remotehost}, starting with an
-@option{ssh} session on host @code{remotehost}:
+to user @samp{root} on host @samp{remotehost}, starting with an
+@option{ssh} session on host @samp{remotehost}:
 
@samp{@value{prefix}ssh@value{postfixhop}%h|su@value{postfixhop}remotehost@value{postfix}}.
 
 On the other hand, if a trailing hop does not specify a host name,
-the host name of the previous hop is reused. Therefore, the following
+the host name of the previous hop is reused.  Therefore, the following
 file name is equivalent to the previous example:
 
@samp{@value{prefix}ssh@value{postfixhop}remotehost|su@value{postfixhop}@value{postfix}}.
 
@@ -4504,9 +4511,9 @@ Note how @samp{%r}, @samp{%h} and @samp{%p} must be 
encoded as
 @samp{%%r}, @samp{%%h} and @samp{%%p}.
 
 @vindex tramp-use-ssh-controlmaster-options
-If the @file{~/.ssh/config} is configured appropriately for the above
-behavior, then any changes to @command{ssh} can be suppressed with
-this @code{nil} setting:
+If the @file{~/.ssh/config} file is configured appropriately for the
+above behavior, then any changes to @command{ssh} can be suppressed
+with this @code{nil} setting:
 
 @lisp
 (customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
@@ -4518,6 +4525,10 @@ This should also be set to @code{nil} if you use the
 @option{ProxyCommand} or @option{ProxyJump} options in your
 @command{ssh} configuration.
 
+On MS Windows, @code{tramp-use-ssh-controlmaster-options} is set to
+@code{nil} by default, because the MS Windows and MSYS2
+implementations of @command{OpenSSH} do not support this option properly.
+
 
 @item
 On multi-hop connections, @value{tramp} does not use @command{ssh}
@@ -5290,7 +5301,7 @@ attributes cache in its process sentinel with this code:
 @end lisp
 
 Since @value{tramp} traverses subdirectories starting with the
-root-directory, it is most likely sufficient to make the
+root directory, it is most likely sufficient to make the
 @code{default-directory} of the process buffer as the root directory.
 
 
@@ -5336,6 +5347,7 @@ The verbosity levels are
 @*@indent @w{ 8}  connection properties
 @*@indent @w{ 9}  test commands
 @*@indent @w{10}  traces (huge)
+@*@indent @w{11}  call traces (maintainer only)
 
 With @code{tramp-verbose} greater than or equal to 4, messages are
 also written to a @value{tramp} debug buffer.  Such debug buffers are
@@ -5384,21 +5396,8 @@ The debug buffer is written as a file in your
 this option with care, because it could decrease the performance of
 @value{tramp} actions.
 
-To enable stepping through @value{tramp} function call traces, they
-have to be specifically enabled as shown in this code:
-
-@lisp
-@group
-(require 'trace)
-(dolist (elt (all-completions "tramp-" obarray 'functionp))
-  (trace-function-background (intern elt)))
-(untrace-function 'tramp-read-passwd)
-@end group
-@end lisp
-
-The buffer @file{*trace-output*} contains the output from the function
-call traces.  Disable @code{tramp-read-passwd} to stop password
-strings from being written to @file{*trace-output*}.
+If @code{tramp-verbose} is greater than or equal to 11, @value{tramp}
+function call traces are written to the buffer @file{*trace-output*}.
 
 
 @node GNU Free Documentation License
diff --git a/doc/misc/trampver.texi b/doc/misc/trampver.texi
index 827c477..10c951d 100644
--- a/doc/misc/trampver.texi
+++ b/doc/misc/trampver.texi
@@ -8,7 +8,7 @@
 @c In the Tramp GIT, the version numbers are auto-frobbed from
 @c tramp.el, and the bug report address is auto-frobbed from
 @c configure.ac.
-@set trampver 2.5.1-pre
+@set trampver 2.5.1
 @set trampurl https://www.gnu.org/software/tramp/
 @set tramp-bug-report-address tramp-devel@@gnu.org
 @set emacsver 25.1
diff --git a/etc/HELLO b/etc/HELLO
index 0cebb2b..577c282 100644
--- a/etc/HELLO
+++ b/etc/HELLO
@@ -59,6 +59,7 @@ Italian (italiano)    Ciao / Buon giorno
 Javanese (ꦧꦱꦗꦮꦶ)       console.log("ꦲꦭꦺꦴ");
 Kannada (ಕನ್ನಡ)        ನಮಸ್ಕಾರ
 Khmer (ភាសាខ្មែរ)      ជំរាបសួរ
+Lakota (Lakȟotiyapi)   Taŋyáŋ yahí!
 Lao (ພາສາລາວ)  ສະບາຍດີ / ຂໍໃຫ້ໂຊກດີ
 Malayalam (മലയാളം)     നമസ്കാരം
 Maldivian (ދިވެހި)     އައްސަލާމު ޢަލައިކުމް / ކިހިނެހް؟
diff --git a/etc/NEWS b/etc/NEWS
index 9bf232a..1a31308 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -26,7 +26,10 @@ applies, and please also update docstrings as needed.
 
 ** Emacs now optionally supports native compilation of Lisp files.
 To enable this, configure Emacs with the '--with-native-compilation' option.
-This requires the libgccjit library to be installed and functional.
+This requires the libgccjit library to be installed and functional,
+and also requires GCC and Binutils to be available when Lisp code is
+natively compiled.  See the Info node "(elisp) Native Compilation" for
+more details.
 
 ---
 ** Support for building with Motif has been removed.
@@ -88,6 +91,12 @@ proper pty support that Emacs needs.
 
 * Startup Changes in Emacs 28.1
 
+---
+** In GTK builds, Emacs now supports startup notification.
+This means that Emacs won't steal keyboard focus upon startup
+(when started via the Desktop) if the user is typing into another
+application.
+
 ** Emacs can support 24-bit color TTY without terminfo database.
 If your text-mode terminal supports 24-bit true color, but your system
 lacks the terminfo database, you can instruct Emacs to support 24-bit
@@ -108,6 +117,21 @@ filters.
 
 * Changes in Emacs 28.1
 
+** 'blink-cursor-mode' is now enabled by default regardless of the UI.
+It used to be enabled when Emacs is started in GUI mode but not when started
+in text mode.  The cursor still only actually blinks in GUI frames.
+
++++
+** Etags now supports the Mercury programming language.
+See https://mercurylang.org.
+
++++
+** Etags command line option '--declarations' now has Mercury-specific 
behavior.
+All Mercury declarations are tagged by default.  However, for
+compatibility with 'etags' support for Prolog, predicates and
+functions appearing first in clauses will also be tagged if 'etags' is
+invoked with the '--declarations' command-line option.
+
 +++
 ** New command 'font-lock-update', bound to 'C-x x f'.
 This command updates the syntax highlighting in this buffer.
@@ -149,7 +173,7 @@ looking at the doc string of a function that belongs to one 
of these
 groups.
 
 ---
-** Improved "find definition" feature of *Help* buffers.
+** Improved "find definition" feature of "*Help*" buffers.
 Now clicking on the link to find the definition of functions generated
 by 'cl-defstruct', or variables generated by 'define-derived-mode',
 for example, will go to the exact place where they are defined.
@@ -181,7 +205,7 @@ commands.
 ** Support for '(box . SIZE)' 'cursor-type'.
 By default, 'box' cursor always has a filled box shape.  But if you
 specify 'cursor-type' to be '(box . SIZE)', the cursor becomes a hollow
-box if the point is on an image larger than 'SIZE' pixels in any
+box if the point is on an image larger than SIZE pixels in any
 dimension.
 
 +++
@@ -276,11 +300,37 @@ commands.  The new keystrokes are 'C-x x g' 
('revert-buffer'),
 ** Commands 'set-frame-width' and 'set-frame-height' can now get their
 input using the minibuffer.
 
+---
+** New help window when Emacs prompts before opening a large file.
+Commands like 'find-file' or 'visit-tags-table' ask to visit a file
+normally or literally when the file is larger than a certain size (by
+default, 9.5 MiB).  Press '?' or 'C-h' in that prompt to read more
+about the different options to visit a file, how you can disable the
+prompt, and how you can tweak the file size threshold.
+
++++
+** Improved support for terminal emulators that encode the Meta flag.
+Some terminal emulators set the 8th bit of Meta characters, and then
+encode the resulting character code as if it were non-ASCII character
+above codepoint 127.  Previously, the only way of using these in Emacs
+was to set up the terminal emulator to use the 'ESC' characters to send
+Meta characters to Emacs, e.g., send "ESC x" when the user types
+'M-x'.  You can now avoid the need for this setup of such terminal
+emulators by using the new input-meta-mode with the special value
+'encoded' with these terminal emulators.
+
++++
+** New frame parameter 'drag-with-tab-line'.
+This parameter, similar to 'drag-with-header-line', allows moving frames
+by dragging the tab lines of their topmost windows with the mouse.
 
 * Editing Changes in Emacs 28.1
 
 +++
-** A prefix arg now causes 'delete-other-frames' to only iconify frames
+** A prefix arg now causes 'delete-other-frames' to only iconify frames.
+
++++
+** The "Edit => Clear" menu item now obeys a rectangular region.
 
 +++
 ** New command 'execute-extended-command-for-buffer'.
@@ -312,12 +362,14 @@ forms, but this command has now been changed to work more 
like
 'eval-defun', and reset the values as specified.
 
 +++
-** Standalone 'M-y' uses the minibuffer to complete previous kills.
-When 'M-y' is typed not after a yank command, it activates the minibuffer
-where you can browse previous kills using the minibuffer history or
-completion.  In Isearch, you can bind 'C-s M-y' to the command
-'isearch-yank-pop' that uses the minibuffer with completion on
-previous kills to read a string and append it to the search string.
+** Standalone 'M-y' allows interactive selection from previous kills.
+'M-y' can now be typed after a command that is not a yank command.
+When invoked like that, it prompts in the minibuffer for one of the
+previous kills, offering completion and minibuffer-history navigation
+through previous kills recorded in the kill ring.  A similar feature
+in Isearch can be invoked if you bind 'C-s M-y' to the command
+'isearch-yank-pop'.  When the user option 'yank-from-kill-ring-rotate'
+is nil the kill ring is not rotated after 'yank-from-kill-ring'.
 
 ---
 ** New user options 'copy-region-blink-delay' and 'delete-pair-blink-delay'.
@@ -367,9 +419,10 @@ setting the variable 'auto-save-visited-mode' 
buffer-locally to nil.
 description of the properties.  Likewise 'button-describe' does the
 same for a button.
 
-** Obsolete commands are no longer hidden from command completion.
+** Obsolete aliases are no longer hidden from command completion.
 Completion of command names now considers obsolete aliases as
-candidates.  Invoking a command via an obsolete alias now mentions the
+candidates, if they were marked obsolete in the current major version
+of Emacs.  Invoking a command via an obsolete alias now mentions the
 obsolescence fact and shows the new name of the command.
 
 +++
@@ -417,6 +470,11 @@ major mode.
 
 * Changes in Specialized Modes and Packages in Emacs 28.1
 
+** Completion List Mode
+New key bindings have been added: 'n' and 'p' to navigate completions,
+and 'M-g M-c' to switch to the minibuffer, and you can also switch back
+to the completion list buffer with 'M-g M-c'.
+
 ** Benchmark
 *** New function 'benchmark-call' to measure the execution time of a function.
 Additionally, the number of repetitions can be expressed as a minimal duration
@@ -432,10 +490,6 @@ in seconds.
 This used to be named 'macroexp--warn-and-return' and has proved useful
 and well-behaved enough to lose the "internal" marker.
 
-** 'blink-cursor-mode' is now enabled by default regardless of the UI.
-It used to be enabled when Emacs is started in GUI mode but not when started
-in text mode.  The cursor still only actually blinks in GUI frames.
-
 ** Bindat
 
 +++
@@ -480,6 +534,21 @@ When emacsclient connects, Emacs will (by default) output 
a message
 about how to exit the client frame.  If 'server-client-instructions'
 is set to nil, this message is inhibited.
 
++++
+*** New command 'server-edit-abort'.
+This command (not bound to any key by default) can be used to abort
+an edit instead of marking it as "Done" (which the 'C-x #' command
+does).  The 'emacsclient' program exits with an abnormal status as
+result of this command.
+
++++
+*** New desktop integration for connecting to the server.
+If your operating system’s desktop environment is
+freedesktop.org-compatible (which is true of most GNU/Linux and other
+recent Unix-like GUIs), you may use the new "Emacs (Client)" desktop
+menu entry to open files in an existing Emacs instance rather than
+starting a new one.  The daemon starts if not already running.
+
 ** Perl mode
 
 ---
@@ -504,9 +573,23 @@ indentation is done using SMIE or with the old ad-hoc code.
 ** Icomplete
 
 +++
-*** New minor mode Icomplete-Vertical mode.
-This mode is intended to be used with Icomplete or Fido, to display the
-list of completions candidates vertically instead of horizontally.
+*** New minor mode 'icomplete-vertical-mode', alias 'fido-vertical-mode'.
+This mode is intended to be used with Icomplete ('M-x icomplete-mode')
+or Fido ('M-x fido-mode'), to display the list of completions
+candidates vertically instead of horizontally.  When used with
+Icomplete, completions are rotated and selection kept at the top.
+When used with Fido, completions scroll like a typical dropdown
+widget.
+
+*** Default value of 'icomplete-compute-delay' has been changed to 0.15 s.
+
+*** Default value of 'icomplete-max-delay-chars' has been changed to 2.
+
+*** Reduced blinking while completing the next completions set.
+Icomplete doesn't hide the hint with the previously computed
+completions anymore when compute delay is in effect, or the previous
+computation has been aborted by input.  Instead it shows the previous
+completions until the new ones are ready.
 
 ---
 ** Specific warnings can now be disabled from the warning buffer.
@@ -521,9 +604,28 @@ disabled entirely.
 ---
 *** Autoload the main entry point 'mspool-show'.
 
+** Windmove
+
+*** New user options to customize windmove keybindings.
+These options include 'windmove-default-keybindings',
+'windmove-display-default-keybindings',
+'windmove-delete-default-keybindings',
+'windmove-swap-states-default-keybindings'.
+
 ** Windows
 
 +++
+*** New user option 'delete-window-choose-selected'.
+This allows to choose a frame's selected window after deleting the
+previously selected one.
+
++++
+*** New argument NO-OTHER for some window functions.
+'get-lru-window', ‘get-mru-window’ and 'get-largest-window' now accept a
+new optional argument NO-OTHER which, if non-nil, avoids returning a
+window whose 'no-other-window' parameter is non-nil.
+
++++
 *** New 'display-buffer' function 'display-buffer-use-least-recent-window'.
 This is like 'display-buffer-use-some-window', but won't reuse the
 current window, and when called repeatedly will try not to reuse a
@@ -688,6 +790,18 @@ line, and allows truncating them (to preserve space on the 
mode line)
 or showing them literally, either instead of, or in addition to,
 displaying "by name" or "by date" sort order.
 
++++
+*** New user option 'dired-compress-directory-default-suffix'.
+This user option controls default suffix for compressing a directory.
+If it's nil, ".tar.gz" will be used.  Refer to
+'dired-compress-files-alist' for a list of supported suffixes.
+
++++
+*** New user option 'dired-compress-file-default-suffix'.
+This user option controls the default suffix for compressing files.
+If it's nil, ".gz" will be used.  Refer to 'dired-compress-file-alist'
+for a list of supported suffixes.
+
 ---
 *** Broken and circular links are shown with the 'dired-broken-symlink' face.
 
@@ -711,6 +825,11 @@ If set to non-nil, Dired will dereference symbolic links 
when copying.
 This can be switched off on a per-usage basis by providing
 'dired-do-copy' with a 'C-u' prefix.
 
+*** New user option 'dired-do-revert-buffer'.
+Non-nil reverts the destination Dired buffer after performing one
+of these operations: 'dired-do-copy', 'dired-do-rename',
+'dired-do-symlink', 'dired-do-hardlink'.
+
 *** New user option 'dired-mark-region' affects all Dired commands
 that mark files.  When non-nil and the region is active in Transient
 Mark mode, then Dired commands operate only on files in the active
@@ -782,9 +901,29 @@ If non-nil, only branches and remotes are considered when 
doing
 completion over Git branch names.  The default is nil, which causes
 tags to be considered as well.
 
+---
+*** New user option 'vc-git-log-switches'.
+String or list of strings specifying switches for Git log under VC.
+
 ** Gnus
 
 +++
+*** New Summary buffer sort options for extra headers.
+The extra header sort option ('C-c C-s C-x') prompts for a header
+and fails if no sort function has been defined.  Sorting by
+Newsgroups ('C-c C-s C-u') has been pre-defined.
+
++++
+*** The '#' command in the Group and Summary buffer now toggles,
+instead of sets, the process mark.
+
++++
+*** New user option 'gnus-process-mark-toggle'.
+If non-nil (the default), the '#' command in the Group and Summary
+buffers will toggle, instead of set, the process mark.
+
+
++++
 *** New user option 'gnus-registry-register-all'.
 If non-nil (the default), create registry entries for all messages.
 If nil, don't automatically create entries, they must be created
@@ -938,6 +1077,7 @@ Clicking on a 'mailto:' link in other applications will 
then open
 Emacs with headers filled out according to the link, e.g.
 "mailto:larsi@gnus.org?subject=This+is+a+test";.  If you prefer
 emacsclient, use "emacsclient -e '(message-mailto "%u")'"
+or "emacsclient-mail.desktop".
 
 ---
 *** Change to default value of 'message-draft-headers' user option.
@@ -990,8 +1130,25 @@ grep-like tools.
 On systems where the grep command supports it, directories will be
 skipped.
 
+*** Commands that use 'grep-find' now follow symlinks for command-line args.
+This is because the default value of 'grep-find-template' now includes
+the 'find' option '-H'.  Commands that use that variable, including
+indirectly via a call to 'xref-matches-in-directory', might be
+affected.  In particular, there should be no need anymore to ensure
+any directory names on the 'find' command lines end in a slash.
+This change is for better compatibility with old versions of non-GNU
+'find', such as the one used on macOS.
+
 ** Help
 
++++
+*** New convenience commands with short keys in the Help buffer.
+New command 'help-view-source' ('s') will view the source file (if
+any) of the current help topic.  New command 'help-goto-info' ('i')
+will look up the current symbol (if any) in Info.  New command
+'help-customize' ('c') will customize the variable or the face
+(if any) whose doc string is being shown in the Help buffer.
+
 ---
 *** The 'help-for-help' ('C-h C-h') screen has been redesigned.
 
@@ -1008,11 +1165,26 @@ GTK toolkit, this is only true if 
'x-gtk-use-system-tooltips' is t.
 *** 'g' ('revert-buffer') in 'help-mode' no longer requires confirmation.
 
 +++
+*** New command 'describe-command' shows help for a command.
+This can be used instead of 'describe-function' for interactive
+commands and is globally bound to 'C-h x'.
+
++++
 *** New command 'describe-keymap' describes keybindings in a keymap.
 
 ---
+*** New user option 'describe-bindings-outline'.
+It enables outlines in the output buffer of 'describe-bindings' that
+can provide a better overview in a long list of available bindings.
+
+---
 *** New keybinding 'C-h R' prompts for a manual to display and displays it.
 
+---
+*** Closing the "*Help*" buffer from the toolbar now buries the buffer.
+In previous Emacs versions, the "*Help*" buffer was killed instead when
+clicking the "X" icon in the tool bar.
+
 +++
 ** New command 'lossage-size'.
 It allows users to set the maximum number of keystrokes and commands
@@ -1048,12 +1220,11 @@ so e.g. like 'C-x 8 [' inserts a left single quotation 
mark,
 'C-x \ [' does the same.
 
 ---
-*** New user options 'read-char-by-name-sort' and 'read-char-by-name-group'.
-'read-char-by-name-sort' defines the sorting order of characters for
-completion of 'C-x 8 RET TAB' and can be customized to sort them
-by codepoints instead of character names by default.  The 't' value of
-'read-char-by-name-group' groups the characters for completion of
-'C-x 8 RET TAB' by Unicode blocks.
+*** New user option 'read-char-by-name-sort'.
+It defines the sorting order of characters for completion of 'C-x 8 RET TAB'
+and can be customized to sort them by codepoints instead of character names.
+Additionally, you can group characters by Unicode blocks after customizing
+'completions-group' and 'completions-group-sort'.
 
 ---
 *** Improved language transliteration in Malayalam input methods.
@@ -1064,6 +1235,14 @@ deprecated.  Errors in the Inscript method were 
corrected.
 *** New input method 'cham'.
 There's also a Cham greeting in "etc/HELLO".
 
+---
+*** New input methods for Lakota language orthographies.
+Two orthographies are represented here, the Suggested Lakota
+Orthography and what is known as the White Hat Orthography.  Input
+methods 'lakota-slo-prefix', 'lakota-slo-postfix', and
+'lakota-white-hat-postfix' have been added.  There is also a Lakota
+greeting in "etc/HELLO".
+
 ** Ispell
 
 +++
@@ -1077,16 +1256,6 @@ defaulting to active region when used interactively.
 ** The old non-SMIE indentation of 'sh-mode' has been removed.
 
 ---
-** The 'list-bookmark' menu is now based on 'tabulated-list-mode'.
-The interactive bookmark list will now benefit from features in
-'tabulated-list-mode' like sorting columns or changing column width.
-
-Support for the optional "inline" header line, allowing for a header
-without using 'header-line-format', has been dropped.  Consequently,
-the variables 'bookmark-bmenu-use-header-line' and
-'bookmark-bmenu-inline-header-height' are now declared obsolete.
-
----
 ** The sb-image.el library is now marked obsolete.
 This file was a compatibility kludge which is no longer needed.
 
@@ -1109,6 +1278,35 @@ To customize obsolete user options, use 
'customize-option' or
 They will be used automatically instead of the old icons.  If Emacs is
 built without SVG support, the old icons will be used instead.
 
+** Bookmarks
+
+*** Bookmarks can now be targets for new tabs.
+When the bookmark.el library is loaded, a customize choice is added
+to 'tab-bar-new-tab-choice' for new tabs to show the bookmark list.
+
+---
+*** The 'list-bookmarks' menu is now based on 'tabulated-list-mode'.
+The interactive bookmark list will now benefit from features in
+'tabulated-list-mode' like sorting columns or changing column width.
+
+Support for the optional "inline" header line, allowing for a header
+without using 'header-line-format', has been dropped.  Consequently,
+the variables 'bookmark-bmenu-use-header-line' and
+'bookmark-bmenu-inline-header-height' are now declared obsolete.
+
+---
+*** New user option 'bookmark-fontify'.
+If non-nil, setting a bookmark will colorize the current line with
+'bookmark-face'.
+
+---
+*** New user option 'bookmark-menu-confirm-deletion'.
+In Bookmark Menu mode, Emacs by default does not prompt for
+confirmation when you type 'x' to execute the deletion of bookmarks
+that have been marked for deletion.  However, if this new option is
+non-nil then Emacs will require confirmation with 'yes-or-no-p' before
+deleting.
+
 ** Edebug
 
 *** Obsoletions
@@ -1185,6 +1383,12 @@ it when producing a doc string.
 This is bound to 'C-x n d' in 'shell-mode' buffers, and narrows to the
 command line under point (and any following output).
 
+---
+*** New user option 'shell-has-auto-cd'.
+If non-nil, 'shell-mode' handles implicit "cd" commands, changing the
+directory if the command is a directory.  Useful for shells like "zsh"
+that has this feature.
+
 ** Eshell
 
 ---
@@ -1192,7 +1396,8 @@ command line under point (and any following output).
 
 ---
 *** Environment variable 'INSIDE_EMACS' is now copied to subprocesses.
-Its value equals the result of evaluating '(format "%s,eshell" emacs-version)'.
+Its value contains the result of evaluating '(format "%s,eshell"
+emacs-version)'.  Other package names, like "tramp", could also be included.
 
 ---
 *** Eshell no longer re-initializes its keymap every call.
@@ -1244,6 +1449,11 @@ When non-nil, this user option instructs Tramp to mirror 
the debug
 buffer to a file under the "/tmp/" directory.  This is useful, if (in
 rare cases) Tramp blocks Emacs, and we need further debug information.
 
++++
+*** Writing sensitive auto-save or backup files to the local temporary
+directory must be confirmed.  In order to suppress this confirmation,
+set user option 'tramp-allow-unsafe-temporary-files' to t.
+
 ** Tempo
 
 ---
@@ -1306,16 +1516,16 @@ See the new user options 'package-name-column-width',
 *** gdb-mi can now store and restore window configurations.
 Use 'gdb-save-window-configuration' to save window configuration to a
 file and 'gdb-load-window-configuration' to load from a file.  These
-commands can also be accessed through the menu bar under 'Gud --
-GDB-Windows'.  'gdb-default-window-configuration-file', when non-nil,
+commands can also be accessed through the menu bar under "Gud =>
+GDB-Windows".  'gdb-default-window-configuration-file', when non-nil,
 is loaded when GDB starts up.
 
 +++
 *** gdb-mi can now restore window configuration after quit.
 Set 'gdb-restore-window-configuration-after-quit' to non-nil and Emacs
 will remember the window configuration before GDB started and restore
-it after GDB quits.  A toggle button is also provided under 'Gud --
-GDB-Windows'.
+it after GDB quits.  A toggle button is also provided under "Gud =>
+GDB-Windows".
 
 +++
 *** gdb-mi now has a better logic for displaying source buffers.
@@ -1416,6 +1626,9 @@ These new navigation commands are bound to 'n' and 'p' in
 *** New command 'apropos-function'.
 This works like 'C-u M-x apropos-command' but is more discoverable.
 
+*** New face 'apropos-button'.
+Applies to buttons that indicate a face.
+
 ** CC Mode
 
 *** Added support for Doxygen documentation style.
@@ -1473,6 +1686,11 @@ symbol property to the browsing commands.  With a new 
command
 'browse-url-with-browser-kind', an URL can explicitly be browsed with
 either an internal or external browser.
 
+---
+*** Support for browsing of remote files.
+If a remote file is taken, a local temporary copy of that file is
+passed to the browser.
+
 *** Support for the conkeror browser is now obsolete.
 
 *** Support for the Mosaic browser has been removed.
@@ -1586,7 +1804,7 @@ This feature relies on librsvg 2.48 or above being 
available.
 Size image properties, for example ':height', ':max-height', etc., can
 be given a cons of the form '(SIZE . em)', where SIZE is an integer or
 float which is multiplied by the font size to calculate the image
-size, and em is a symbol.
+size, and 'em' is a symbol.
 
 ** EWW
 
@@ -1693,8 +1911,8 @@ If chosen, file names in "*xref*" buffers will be 
displayed relative
 to the 'project-root' of the current project, when available.
 
 +++
-*** The TAB key binding in *xref* buffers is obsolete.
-Use 'C-u RET' instead.  The TAB binding in *xref* buffers is still
+*** The 'TAB' key binding in "*xref*" buffers is obsolete.
+Use 'C-u RET' instead.  The 'TAB' binding in "*xref*" buffers is still
 supported, but we plan on removing it in a future version; at that
 time, the command 'xref-quit-and-goto-xref' will no longer have a key
 binding in 'xref--xref-buffer-mode-map'.
@@ -1765,36 +1983,10 @@ activity overview sidebar for joined IRC channels is 
now part of ERC.
 The 'erc-tls' function has been updated to allow specifying a TLS
 client certificate for authentication, as an alternative to NickServ
 password-based authentication.  This is referred to as "CertFP" (short
-for Certificate Fingerprint) by several IRC networks.
-
-To use a certificate with 'erc-tls', specify the ':client-certificate'
-optional parameter, whose value should be as described in the
-documentation of 'open-network-stream': if non-nil, it should either
-be a list where the first element is the file name of the private key
-corresponding to a client certificate and the second element is the
-file name of the client certificate itself to use when connecting over
-TLS, or t, which means that 'auth-source' will be queried for the
-private key and the certificate.
-
-Examples of use:
-
-    (erc-tls :server "chat.freenode.net" :port 6697
-             :client-certificate
-             '("/home/bandali/my-cert.key"
-               "/home/bandali/my-cert.crt"))
-
-    (erc-tls :server "chat.freenode.net" :port 6697
-             :client-certificate
-             `(,(expand-file-name "~/cert-freenode.key")
-               ,(expand-file-name "~/cert-freenode.crt")))
-
-    (erc-tls :server "chat.freenode.net" :port 6697
-             :client-certificate t)
-
-In the case of ':client-certificate t', you will need to add a line
-like the following to your authinfo file (e.g. "~/.authinfo.gpg"):
-
-    machine chat.freenode.net key /home/bandali/my-cert.key cert 
/home/bandali/my-cert.crt
+for Certificate Fingerprint) by several IRC networks.  See the Info
+node "(erc) Connecting" in the ERC manual for more details and
+examples on how to specify and use TLS client certificates with
+'erc-tls'.
 
 ** Battery
 
@@ -1947,9 +2139,43 @@ This allows mode-specific alterations to how 
'thing-at-point' works.
 This is so 'C-a' works as in other modes, and in particular holding
 Shift while typing 'C-a', i.e. 'C-S-a', will now highlight the text.
 
+** ERT
+
++++
+*** ERT can now output more verbose test failure reports.
+If the 'EMACS_TEST_VERBOSE' environment variable is set, failure
+summaries will include the failing condition.
+
 ** Miscellaneous
 
 +++
+*** New user option 'kill-transform-function'.
+This can be used to transform (and suppress) strings from entering the
+kill ring.
+
+---
+*** 'C-u M-x dig' will now prompt for a query type to use.
+
++++
+*** rcirc now supports SASL authentication.
+
++++
+*** 'save-interprogram-paste-before-kill' can now be a number.
+In that case, it's interpreted as a limit on the size of the clipboard
+data that will be saved to the 'kill-ring' prior to killing text: if
+the size of the clipboard data is greater than or equal to the limit,
+it will not be saved.
+
+---
+*** New variable 'hl-line-overlay-priority'.
+This can be used to change the priority of the hl-line overlays.
+
++++
+*** New command 'mailcap-view-file'.
+This command will open a viewer based on the file type, as determined
+by "~/.mailcap" and related files and variables.
+
++++
 *** New command 'C-x C-k Q' to force redisplay in keyboard macros.
 
 ---
@@ -2189,10 +2415,6 @@ The width now depends of the width of the window, but 
will never be
 wider than the length of the longest buffer name, except that it will
 never be narrower than 19 characters.
 
-*** Bookmarks can now be targets for new tabs.
-When the bookmark.el library is loaded, a customize choice is added
-to 'tab-bar-new-tab-choice' for new tabs to show the bookmark list.
-
 ---
 *** Movement commands in 'gomoku-mode' are fixed.
 'gomoku-move-sw' and 'gomoku-move-ne' now work correctly, and
@@ -2362,10 +2584,19 @@ You can type 'C-x u u' instead of 'C-x u C-x u' to undo 
many changes,
 'M-g n n p p' to navigate next-error matches.  Any other key exits
 transient mode and then is executed normally.  'repeat-exit-key'
 defines an additional key to exit mode like 'isearch-exit' ('RET').
-With 'repeat-keep-prefix' you can keep the prefix arg of the previous command.
-For example, this can help to reverse the window navigation direction
-with e.g. 'C-x o M-- o o'.  Also it can help to set a new step with
-e.g. 'C-x { C-5 { { {' will set the window resizing step to 5 columns.
+The user option 'repeat-exit-timeout' specifies the number of
+seconds of idle time to break the repetition chain automatically.
+With 'repeat-keep-prefix' you can keep the prefix arg of the previous
+command.  For example, this can help to reverse the window navigation
+direction with e.g. 'C-x o M-- o o'.  Also it can help to set a new
+step with e.g. 'C-x { C-5 { { {', which will set the window resizing
+step to 5 columns.
+
++++
+** EasyPG
+GPG key servers can now be queried for keys with the
+'M-x epa-search-keys' command.  Keys can then be added to your
+personal key ring.
 
 
 * New Modes and Packages in Emacs 28.1
@@ -2404,6 +2635,13 @@ similar to prefix arguments, but are more flexible and 
discoverable.
 
 * Incompatible Editing Changes in Emacs 28.1
 
+** 'electric-indent-mode' now also indents inside strings and comments,
+(unless the indentation function doesn't, of course).
+To recover the previous behavior you can use:
+
+    (add-hook 'electric-indent-functions
+              (lambda (_) (if (nth 8 (syntax-ppss)) 'no-indent)))
+
 ** The 'M-o' ('facemenu-keymap') global binding has been removed.
 To restore the old binding, say something like:
 
@@ -2449,9 +2687,29 @@ This is to keep the same behavior as Eshell.
 
 * Incompatible Lisp Changes in Emacs 28.1
 
+---
+** Some floating-point numbers are now handled differently by the Lisp reader.
+In previous versions of Emacs, numbers with a trailing dot and an exponent
+were read as integers and the exponent ignored: 2.e6 was interpreted as the
+integer 2.  Such numerals are now read as floats with the exponent included:
+2.e6 is now read as the floating-point value 2000000.0.
+That is, '(read-from-string "1.e3")' => '(1000.0 . 4)' now.
+
++++
+** The 'lexical-binding' local variable is always enabled.
+Previously, if 'enable-local-variables' was nil, a 'lexical-binding'
+local variable would not be heeded.  This has now changed, and a file
+with a 'lexical-binding' cookie is always heeded.  To revert to the
+old behavior, set 'permanently-enabled-local-variables' to nil.
+
++++
+** 'completing-read-default' sets completion variables buffer-locally.
+'minibuffer-completion-table' and related variables are now set buffer-locally
+in the minibuffer instead of being set via a global let-binding.
+
 +++
 ** The use of positional arguments in 'define-minor-mode' is obsolete.
-These were actually rendered obsolete in Emacs-21 but were never
+These were actually rendered obsolete in Emacs 21 but were never
 marked as such.
 
 ** 'facemenu-color-alist' is now obsolete, and is not used.
@@ -2576,16 +2834,16 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 'icalendar--datetime-to-noneuropean-date', 'image-mode-maybe',
 'imenu-example--name-and-position', 'ispell-aspell-supports-utf8',
 'lisp-mode-auto-fill', 'locate-file-completion', 'make-coding-system',
-'minibuffer-local-must-match-filename-map', 'mouse-choose-completion',
-'mouse-major-mode-menu', 'mouse-popup-menubar',
-'mouse-popup-menubar-stuff', 'newsticker-groups-filename',
-'nnir-swish-e-index-file', 'nnmail-fix-eudora-headers',
-'non-iso-charset-alist', 'nonascii-insert-offset',
-'nonascii-translation-table', 'password-read-and-add',
-'pre-abbrev-expand-hook', 'princ-list', 'print-help-return-message',
-'process-filter-multibyte-p', 'read-file-name-predicate',
-'remember-buffer', 'rmail-highlight-face', 'rmail-message-filter',
-'semantic-after-idle-scheduler-reparse-hooks',
+'menu-bar-files-menu', 'minibuffer-local-must-match-filename-map',
+'mouse-choose-completion', 'mouse-major-mode-menu',
+'mouse-popup-menubar', 'mouse-popup-menubar-stuff',
+'newsticker-groups-filename', 'nnir-swish-e-index-file',
+'nnmail-fix-eudora-headers', 'non-iso-charset-alist',
+'nonascii-insert-offset', 'nonascii-translation-table',
+'password-read-and-add', 'pre-abbrev-expand-hook', 'princ-list',
+'print-help-return-message', 'process-filter-multibyte-p',
+'read-file-name-predicate', 'remember-buffer', 'rmail-highlight-face',
+'rmail-message-filter', 'semantic-after-idle-scheduler-reparse-hooks',
 'semantic-after-toplevel-bovinate-hook',
 'semantic-before-idle-scheduler-reparse-hooks',
 'semantic-before-toplevel-bovination-hook',
@@ -2639,14 +2897,43 @@ back in Emacs 23.1.  The affected functions are: 
'make-obsolete',
 
 +++
 ** The '&define' keyword in an Edebug specification now disables backtracking.
-The implementation was buggy, and multiple &define forms in an &or
-form should be exceedingly rare.  See the Info node 'Backtracking' in
+The implementation was buggy, and multiple '&define' forms in an '&or'
+form should be exceedingly rare.  See the Info node "(elisp) Backtracking" in
 the Emacs Lisp reference manual for background.
 
+---
+** 'sql-*-statement-starters' are no longer user options.
+These variables describe facts about the SQL standard and
+product-specific additions.  There should be no need for users to
+customize them.
+
+---
+** Function 'lm-maintainer' is replaced with 'lm-maintainers'.
+The former is now declared obsolete.
+
 
 * Lisp Changes in Emacs 28.1
 
 +++
+** New function 'syntax-class-to-char'.
+This does almost the opposite of 'string-to-syntax' -- it returns the
+syntax descriptor (a character) given a raw syntax descriptor (an
+integer).
+
++++
+** New function 'buffer-local-boundp'.
+This predicate says whether a symbol is bound in a specific buffer.
+
+---
+** Emacs now attempts to test for high-rate subprocess output more fairly.
+When several subprocesses produce output simultaneously at high rate,
+Emacs will now by default attempt to service them all in a round-robin
+fashion.  Set the new variable 'process-prioritize-lower-fds' to a
+non-nil value to get back the old behavior, whereby after reading
+from a subprocess, Emacs would check for output of other subprocesses
+in a way that is likely to read from the same process again.
+
++++
 ** New function 'sxhash-equal-including-properties'.
 This is identical to 'sxhash-equal' but accounting also for string
 properties.
@@ -2723,6 +3010,10 @@ each element is a list with three elements: a completion,
 a prefix string, and a suffix string.
 
 +++
+** New completion function 'group-function' for grouping candidates.
+It takes two arguments: a completion candidate and a 'transform' flag.
+
++++
 ** 'read-char-from-minibuffer' and 'y-or-n-p' support 'help-form'.
 If you bind 'help-form' to a non-nil value while calling these functions,
 then pressing 'C-h' ('help-char') causes the function to evaluate 'help-form'
@@ -2791,6 +3082,11 @@ been added, and takes a callback to handle the return 
status.
 ** 'ascii' is now a coding system alias for 'us-ascii'.
 
 +++
+** New function 'file-name-with-extension'.
+This function allows a canonical way to set/replace the extension of a
+file name.
+
++++
 ** New function 'file-backup-file-names'.
 This function returns the list of file names of all the backup files
 of its file argument.
@@ -3031,9 +3327,16 @@ The special events 'dbus-event' and 'file-notify' are 
now ignored in
 
 +++
 ** 'condition-case' now allows for a success handler.
-It is written as (:success BODY...) where BODY is executed whenever
-the protected form terminates without error, with the specified
-variable bound to the the value of the protected form.
+It is written as '(:success BODY...)' where BODY is executed
+whenever the protected form terminates without error, with the
+specified variable bound to the the value of the protected form.
+
++++
+** 'The 'uniquify' argument in 'auto-save-file-name-transforms' can be a 
symbol.
+If this symbol is one of the members of 'secure-hash-algorithms',
+Emacs constructs the nondirectory part of the auto-save file name by
+applying that 'secure-hash' to the buffer file name.  This avoids any
+risk of excessively long file names.
 
 
 * Changes in Emacs 28.1 on Non-Free Operating Systems
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index 55045d1..4b4c1a3 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -2701,7 +2701,7 @@ days there are in a month in a specific year), 
'date-ordinal-to-time'
 (that computes the date of an ordinal day), 'decoded-time-add' (for
 doing computations on a decoded time structure), 'make-decoded-time'
 (for making a decoded time structure with only the given keywords
-filled out), and 'encoded-time-set-defaults' (which fills in nil
+filled out), and 'decoded-time-set-defaults' (which fills in nil
 elements as if it's midnight January 1st, 1970) have been added.
 
 *** In the DST slot, 'encode-time' and 'parse-time-string' now return -1
diff --git a/etc/TODO b/etc/TODO
index f806b6c..1d6824c 100644
--- a/etc/TODO
+++ b/etc/TODO
@@ -1763,8 +1763,17 @@ apparently loses under Solaris, at least. [fx has mostly 
done this.]
 (Obsolete, since gmalloc.c is nowadays only used on MS-DOS.)
 
 ** Rewrite make-docfile to be clean and maintainable
-It might be better to replace it with Lisp, using the byte compiler.
+It might be better to replace with Lisp the part of make-docfile that
+produces the etc/DOC file by scanning *.el files, for example by
+reusing the code in the byte compiler or in autoload.el that already
+scans *.el files.
 https://lists.gnu.org/r/emacs-devel/2012-06/msg00037.html
+https://lists.gnu.org/r/emacs-devel/2021-05/msg00235.html
+
+** Eliminate the etc/DOC file altogether
+As an alternative to the previous item, we could try and eliminate the
+DOC file altogether.  See
+https://lists.gnu.org/r/emacs-devel/2021-05/msg00237.html
 
 ** Add an inferior-comint-minor-mode
 The purpose is to have a mode to capture the common set of operations
diff --git a/etc/emacs-mail.desktop b/etc/emacs-mail.desktop
index 0c5fab1..3468033 100644
--- a/etc/emacs-mail.desktop
+++ b/etc/emacs-mail.desktop
@@ -2,11 +2,9 @@
 Categories=Network;Email;
 Comment=GNU Emacs is an extensible, customizable text editor - and more
 Exec=emacs -f message-mailto %u
-# If you prefer to use emacsclient, use this instead
-#Exec=emacsclient -e '(message-mailto "%u")'
 Icon=emacs
 Name=Emacs (Mail)
 MimeType=x-scheme-handler/mailto;
-NoDisplay=false
+NoDisplay=true
 Terminal=false
 Type=Application
diff --git a/etc/emacs.desktop b/etc/emacs.desktop
index 2e6496e..81c53c6 100644
--- a/etc/emacs.desktop
+++ b/etc/emacs.desktop
@@ -8,5 +8,6 @@ Icon=emacs
 Type=Application
 Terminal=false
 Categories=Development;TextEditor;
+StartupNotify=true
 StartupWMClass=Emacs
 Keywords=Text;Editor;
diff --git a/etc/emacs.appdata.xml b/etc/emacs.metainfo.xml
similarity index 58%
rename from etc/emacs.appdata.xml
rename to etc/emacs.metainfo.xml
index ca6233a..7467b88 100644
--- a/etc/emacs.appdata.xml
+++ b/etc/emacs.metainfo.xml
@@ -3,9 +3,9 @@
 <component type="desktop-application">
  <id>org.gnu.emacs</id>
  <metadata_license>GFDL-1.3+</metadata_license>
- <project_license>GPL-3.0+ and GFDL-1.3+</project_license>
  <name>GNU Emacs</name>
  <summary>An extensible text editor</summary>
+ <icon type="remote" width="128" 
height="128">https://www.gnu.org/software/emacs/images/emacs.png</icon>
  <description>
   <p>
    GNU Emacs is an extensible, customizable text editor - and more.
@@ -23,13 +23,26 @@
    interface, calendar, and more</li>
   </ul>
  </description>
+ <categories>
+   <category>Development</category>
+   <category>TextEditor</category>
+ </categories>
+ <url type="homepage">https://www.gnu.org/software/emacs</url>
+ <url type="bugtracker">https://debbugs.gnu.org/</url>
+ <url 
type="faq">https://www.gnu.org/software/emacs/manual/html_mono/efaq.html</url>
+ <url type="help">https://www.gnu.org/software/emacs/documentation.html</url>
+ <url type="donation">https://my.fsf.org/donate/</url>
+ <url type="contact">https://lists.gnu.org/mailman/listinfo/emacs-devel/</url>
+ <launchable type="desktop-id">emacs.desktop</launchable>
+ <launchable type="service">emacs.service</launchable>
+ <project_group>GNU</project_group>
+ <project_license>GPL-3.0+ and GFDL-1.3+</project_license>
+ <developer_name>Free Software Foundation</developer_name>
  <screenshots>
   <screenshot type="default">
-  <image type="source" width="632" 
height="354">https://www.gnu.org/software/emacs/images/appdata-26.png</image>
- </screenshot>
+    <image type="source" width="632" 
height="354">https://www.gnu.org/software/emacs/images/appdata-26.png</image>
+    <caption>Editing a Lisp program whilst viewing the Emacs manual.</caption>
+  </screenshot>
  </screenshots>
- <launchable type="desktop-id">emacs</launchable>
- <url type="homepage">https://www.gnu.org/software/emacs</url>
  <update_contact>emacs-devel_AT_gnu.org</update_contact>
- <project_group>GNU</project_group>
 </component>
diff --git a/etc/emacsclient-mail.desktop b/etc/emacsclient-mail.desktop
new file mode 100644
index 0000000..8d51dcd
--- /dev/null
+++ b/etc/emacsclient-mail.desktop
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Categories=Network;Email;
+Comment=GNU Emacs is an extensible, customizable text editor - and more
+Exec=sh -c 'exec emacsclient --alternate-editor= --display="$DISPLAY" --eval 
"(message-mailto \"%u\")"'
+Icon=emacs
+Name=Emacs (Mail, Client)
+MimeType=x-scheme-handler/mailto;
+NoDisplay=true
+Terminal=false
+Type=Application
+Actions=new-window;new-instance;
+
+[Desktop Action new-window]
+Name=New Window
+Exec=emacsclient --alternate-editor= --create-frame --eval '(message-mailto 
"%u")'
+
+[Desktop Action new-instance]
+Name=New Instance
+Exec=emacs -f message-mailto %u
diff --git a/etc/emacsclient.desktop b/etc/emacsclient.desktop
index 3feb83c..cd45463 100644
--- a/etc/emacsclient.desktop
+++ b/etc/emacsclient.desktop
@@ -3,10 +3,20 @@ Name=Emacs (Client)
 GenericName=Text Editor
 Comment=Edit text
 
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
-Exec=emacsclient -c %F
+Exec=sh -c 'if [ -n "$*" ]; then exec emacsclient --alternate-editor= 
--display="$DISPLAY" "$@"; else exec emacsclient --alternate-editor= 
--create-frame; fi' placeholder %F
 Icon=emacs
 Type=Application
 Terminal=false
 Categories=Development;TextEditor;
-StartupWMClass=Emacsd
+StartupNotify=true
+StartupWMClass=Emacs
 Keywords=Text;Editor;
+Actions=new-window;new-instance;
+
+[Desktop Action new-window]
+Name=New Window
+Exec=emacsclient --alternate-editor= --create-frame %F
+
+[Desktop Action new-instance]
+Name=New Instance
+Exec=emacs %F
diff --git a/etc/themes/modus-operandi-theme.el 
b/etc/themes/modus-operandi-theme.el
index 77c2e11..cd73681 100644
--- a/etc/themes/modus-operandi-theme.el
+++ b/etc/themes/modus-operandi-theme.el
@@ -4,7 +4,7 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.3.2
+;; Version: 1.4.0
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
diff --git a/etc/themes/modus-themes.el b/etc/themes/modus-themes.el
index 08e634e..c70c560 100644
--- a/etc/themes/modus-themes.el
+++ b/etc/themes/modus-themes.el
@@ -4,8 +4,8 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.3.2
-;; Last-Modified: <2021-04-18 06:25:05 +0300>
+;; Version: 1.4.0
+;; Last-Modified: <2021-05-25 12:25:39 +0300>
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
@@ -28,21 +28,23 @@
 ;;
 ;; The Modus themes conform with the highest standard for color-contrast
 ;; accessibility between background and foreground values (WCAG AAA).
-;; This file contains all customization options, helper functions,
+;; This file contains all customization variables, helper functions,
 ;; interactive commands, and face specifications.  Please refer to the
 ;; official Info manual for further documentation (distributed with the
 ;; themes, or available at: <https://protesilaos.com/modus-themes>).
 ;;
-;; The themes share the following customization options, all of which
+;; The themes share the following customization variables, all of which
 ;; are disabled by default (nil):
 ;;
 ;;     modus-themes-slanted-constructs             (boolean)
 ;;     modus-themes-bold-constructs                (boolean)
 ;;     modus-themes-variable-pitch-headings        (boolean)
 ;;     modus-themes-variable-pitch-ui              (boolean)
+;;     modus-themes-scale-headings                 (boolean)
+;;     modus-themes-subtle-line-numbers            (boolean)
+;;     modus-themes-success-deuteranopia           (boolean)
 ;;     modus-themes-no-mixed-fonts                 (boolean)
 ;;     modus-themes-headings                       (alist)
-;;     modus-themes-scale-headings                 (boolean)
 ;;     modus-themes-fringes                        (choice)
 ;;     modus-themes-lang-checkers                  (choice)
 ;;     modus-themes-org-blocks                     (choice)
@@ -52,11 +54,11 @@
 ;;     modus-themes-diffs                          (choice)
 ;;     modus-themes-syntax                         (choice)
 ;;     modus-themes-hl-line                        (choice)
-;;     modus-themes-subtle-line-numbers            (boolean)
 ;;     modus-themes-paren-match                    (choice)
 ;;     modus-themes-region                         (choice)
 ;;     modus-themes-links                          (choice)
 ;;     modus-themes-completions                    (choice)
+;;     modus-themes-mail-citations                 (choice)
 ;;
 ;; The default scale for headings is as follows (it can be customized as
 ;; well---remember, no scaling takes place by default):
@@ -67,7 +69,7 @@
 ;;     modus-themes-scale-4 1.2
 ;;     modus-themes-scale-5 1.3
 ;;
-;; There also exist two unique customization options for overriding
+;; There also exist two unique customization variables for overriding
 ;; color palette values.  The specifics are documented in the manual.
 ;; The symbols are:
 ;;
@@ -97,6 +99,7 @@
 ;;     bm
 ;;     bongo
 ;;     boon
+;;     bookmark
 ;;     breakpoint (provided by built-in gdb-mi.el)
 ;;     buffer-expose
 ;;     calendar and diary
@@ -116,7 +119,6 @@
 ;;     corfu
 ;;     counsel
 ;;     counsel-css
-;;     counsel-notmuch
 ;;     counsel-org-capture-string
 ;;     cov
 ;;     cperl-mode
@@ -259,7 +261,7 @@
 ;;     minibuffer-line
 ;;     minimap
 ;;     mmm-mode
-;;     modeline
+;;     mode-line
 ;;     mood-line
 ;;     mpdel
 ;;     mu4e
@@ -360,7 +362,7 @@
 ;;     tuareg
 ;;     typescript
 ;;     undo-tree
-;;     vc (built-in mode line status for version control)
+;;     vc (vc-dir.el, vc-hooks.el)
 ;;     vc-annotate (C-x v g)
 ;;     vdiff
 ;;     vertico
@@ -414,7 +416,15 @@
 (eval-when-compile (require 'cl-lib))
 
 (defgroup modus-themes ()
-  "Options for `modus-operandi', `modus-vivendi'."
+  "Options for `modus-operandi', `modus-vivendi'.
+The Modus themes conform with the WCAG AAA standard for color
+contrast between background and foreground combinations (a
+minimum contrast of 7:1---the highest standard of its kind).  The
+themes also strive to empower users with red-green color
+deficiency: this is achieved through customization variables that
+replace all relevant instances of green with blue, as well as the
+overall design of the themes which relies mostly on colors that
+cover the blue-cyan-magenta side of the spectrum."
   :group 'faces
   :link '(info-link "(modus-themes) Top")
   :prefix "modus-themes-"
@@ -424,16 +434,6 @@
 
 ;;;; Modus Operandi
 
-(define-obsolete-variable-alias
-  'modus-operandi-theme-default-colors-alist
-  'modus-themes-colors-operandi
-  "1.0.0")
-
-(define-obsolete-variable-alias
-  'modus-themes-colors-operandi
-  'modus-themes-operandi-colors
-  "1.1.0")
-
 (defconst modus-themes-operandi-colors
   '(;; base values
     (bg-main . "#ffffff") (fg-main . "#000000")
@@ -587,10 +587,6 @@
     ;; bg-tab-bar is only intended for the bar that holds the tabs and
     ;; can only be combined with fg-main
     ;;
-    ;; fg-tab-accent is meant to be combined with bg-tab-active,
-    ;; though only for styling special elements, such as underlining
-    ;; the current tab
-    ;;
     ;; fg-escape-char-construct and fg-escape-char-backslash can
     ;; be combined bg-main, bg-dim, bg-alt
     ;;
@@ -610,10 +606,12 @@
     ;; all pairs are combinable with themselves
     (bg-hl-line . "#f2eff3")
     (bg-hl-line-intense . "#e0e0e0")
+    (bg-hl-line-intense-accent . "#b9e1ef")
     (bg-hl-alt . "#fbeee0")
     (bg-hl-alt-intense . "#e8dfd1")
     (bg-paren-match . "#e0af82")
     (bg-paren-match-intense . "#c488ff")
+    (bg-paren-expression . "#dff0ff")
     (bg-region . "#bcbcbc")
     (bg-region-accent . "#afafef")
 
@@ -621,7 +619,6 @@
     (bg-tab-active . "#f6f6f6")
     (bg-tab-inactive . "#bdbdbd")
     (bg-tab-inactive-alt . "#999999")
-    (fg-tab-accent . "#30169e")
 
     (red-tab . "#680000")
     (green-tab . "#003900")
@@ -648,7 +645,7 @@
     (fg-unfocused . "#56576d")
 
     (fg-docstring . "#2a486a")
-    (fg-comment-yellow . "#5f4400")
+    (fg-comment-yellow . "#794319")
 
     (bg-header . "#e5e5e5") (fg-header . "#2a2a2a")
 
@@ -673,22 +670,12 @@
     (bg-mark-sel . "#a0f0cf") (fg-mark-sel . "#005040")
     (bg-mark-del . "#ffccbb") (fg-mark-del . "#840040")
     (bg-mark-alt . "#f5d88f") (fg-mark-alt . "#782900"))
-  "The entire palette of `modus-operandi' theme.
+  "The entire palette of the `modus-operandi' theme.
 Each element has the form (NAME . HEX) with the former as a
 symbol and the latter as a string.")
 
 ;;;; Modus Vivendi
 
-(define-obsolete-variable-alias
-  'modus-vivendi-theme-default-colors-alist
-  'modus-themes-colors-vivendi
-  "1.0.0")
-
-(define-obsolete-variable-alias
-  'modus-themes-colors-vivendi
-  'modus-themes-vivendi-colors
-  "1.1.0")
-
 (defconst modus-themes-vivendi-colors
   '(;; base values
     (bg-main . "#000000") (fg-main . "#ffffff")
@@ -712,29 +699,29 @@ symbol and the latter as a string.")
     (bg-special-calm . "#392a48") (fg-special-calm . "#fbd6f4")
     ;; foregrounds that can be combined with bg-main, bg-dim, bg-alt
     (red . "#ff8059")
-    (red-alt . "#f4923b")
-    (red-alt-other . "#ff9977")
+    (red-alt . "#ef8b50")
+    (red-alt-other . "#ff9077")
     (red-faint . "#ffa0a0")
     (red-alt-faint . "#f5aa80")
     (red-alt-other-faint . "#ff9fbf")
     (green . "#44bc44")
-    (green-alt . "#70c900")
-    (green-alt-other . "#00cd68")
-    (green-faint . "#88cf88")
-    (green-alt-faint . "#a8cf88")
-    (green-alt-other-faint . "#88cfaf")
-    (yellow . "#eecc00")
-    (yellow-alt . "#cfdf30")
-    (yellow-alt-other . "#f0ce43")
+    (green-alt . "#70b900")
+    (green-alt-other . "#00c06f")
+    (green-faint . "#78bf78")
+    (green-alt-faint . "#99b56f")
+    (green-alt-other-faint . "#88bf99")
+    (yellow . "#e0cc00")
+    (yellow-alt . "#c4d030")
+    (yellow-alt-other . "#e3c55f")
     (yellow-faint . "#d2b580")
     (yellow-alt-faint . "#cabf77")
     (yellow-alt-other-faint . "#d0ba95")
     (blue . "#2fafff")
     (blue-alt . "#79a8ff" )
     (blue-alt-other . "#00bcff")
-    (blue-faint . "#92baff")
-    (blue-alt-faint . "#a0acf5")
-    (blue-alt-other-faint . "#87c8ff")
+    (blue-faint . "#82b0ec")
+    (blue-alt-faint . "#a0acef")
+    (blue-alt-other-faint . "#80b2f0")
     (magenta . "#feacd0")
     (magenta-alt . "#f78fe7")
     (magenta-alt-other . "#b6a0ff")
@@ -742,7 +729,7 @@ symbol and the latter as a string.")
     (magenta-alt-faint . "#ef9fe4")
     (magenta-alt-other-faint . "#cfa6ff")
     (cyan . "#00d3d0")
-    (cyan-alt . "#4ae8fc")
+    (cyan-alt . "#4ae2f0")
     (cyan-alt-other . "#6ae4b9")
     (cyan-faint . "#90c4ed")
     (cyan-alt-faint . "#a0bfdf")
@@ -842,10 +829,6 @@ symbol and the latter as a string.")
     ;; bg-tab-bar is only intended for the bar that holds the tabs and
     ;; can only be combined with fg-main
     ;;
-    ;; fg-tab-accent is meant to be combined with bg-tab-active,
-    ;; though only for styling special elements, such as underlining
-    ;; the current tab
-    ;;
     ;; fg-escape-char-construct and fg-escape-char-backslash can
     ;; be combined bg-main, bg-dim, bg-alt
     ;;
@@ -865,10 +848,12 @@ symbol and the latter as a string.")
     ;; all pairs are combinable with themselves
     (bg-hl-line . "#151823")
     (bg-hl-line-intense . "#2f2f2f")
+    (bg-hl-line-intense-accent . "#00353f")
     (bg-hl-alt . "#181732")
     (bg-hl-alt-intense . "#282e46")
     (bg-paren-match . "#5f362f")
     (bg-paren-match-intense . "#7416b5")
+    (bg-paren-expression . "#221044")
     (bg-region . "#3c3c3c")
     (bg-region-accent . "#4f3d88")
 
@@ -876,7 +861,6 @@ symbol and the latter as a string.")
     (bg-tab-active . "#0e0e0e")
     (bg-tab-inactive . "#3d3d3d")
     (bg-tab-inactive-alt . "#595959")
-    (fg-tab-accent . "#5ac3cf")
 
     (red-tab . "#ffc0bf")
     (green-tab . "#88ef88")
@@ -903,7 +887,7 @@ symbol and the latter as a string.")
     (fg-unfocused . "#93959b")
 
     (fg-docstring . "#b0d6f5")
-    (fg-comment-yellow . "#cab98f")
+    (fg-comment-yellow . "#d0a070")
 
     (bg-header . "#212121") (fg-header . "#dddddd")
 
@@ -928,7 +912,7 @@ symbol and the latter as a string.")
     (bg-mark-sel . "#002f2f") (fg-mark-sel . "#60cfa2")
     (bg-mark-del . "#5a0000") (fg-mark-del . "#ff99aa")
     (bg-mark-alt . "#3f2210") (fg-mark-alt . "#f0aa20"))
-  "The entire palette of `modus-vivendi' theme.
+  "The entire palette of the `modus-vivendi' theme.
 Each element has the form (NAME . HEX) with the former as a
 symbol and the latter as a string.")
 
@@ -1080,38 +1064,38 @@ or for completion interfaces.
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-red nil
-  "A red background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A red background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-green nil
-  "A green background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A green background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-yellow nil
-  "A yellow background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A yellow background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-blue nil
-  "A blue background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A blue background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-magenta nil
-  "A magenta background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A magenta background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-active-cyan nil
-  "A cyan background meant for use on the modeline or similar.
-This is combined with the modelines primary foreground value.
+  "A cyan background meant for use on the mode line or similar.
+This is combined with the mode lines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
@@ -1153,81 +1137,87 @@ The actual styling of the face is done by 
`modus-themes-faces'.")
 
 (defface modus-themes-nuanced-red nil
   "A nuanced red background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-nuanced-green nil
   "A nuanced green background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-nuanced-yellow nil
   "A nuanced yellow background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-nuanced-blue nil
   "A nuanced blue background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-nuanced-magenta nil
   "A nuanced magenta background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-nuanced-cyan nil
   "A nuanced cyan background.
-This does not specify a foreground of its own.  Instead it is meant to
-serve as the backdrop for elements such as Org blocks, headings, and any
-other surface that needs to retain the colors on display.
+This does not specify a foreground of its own.  Instead it is
+meant to serve as the backdrop for elements such as Org blocks,
+headings, and any other surface that needs to retain the colors
+on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-special-cold nil
   "Combines the 'special cold' background and foreground values.
 This is intended for cases when a neutral gray background is not
-suitable and where a combination of more saturated colors would not be
-appropriate.
+suitable and where a combination of more saturated colors would
+not be appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-special-mild nil
   "Combines the 'special mild' background and foreground values.
 This is intended for cases when a neutral gray background is not
-suitable and where a combination of more saturated colors would not be
-appropriate.
+suitable and where a combination of more saturated colors would
+not be appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-special-warm nil
   "Combines the 'special warm' background and foreground values.
 This is intended for cases when a neutral gray background is not
-suitable and where a combination of more saturated colors would not be
-appropriate.
+suitable and where a combination of more saturated colors would
+not be appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-special-calm nil
   "Combines the 'special calm' background and foreground values.
 This is intended for cases when a neutral gray background is not
-suitable and where a combination of more saturated colors would not be
-appropriate.
+suitable and where a combination of more saturated colors would
+not be appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
@@ -1331,64 +1321,64 @@ The actual styling of the face is done by 
`modus-themes-faces'.")
 
 (defface modus-themes-heading-1 nil
   "General purpose face for use in headings level 1.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-2 nil
   "General purpose face for use in headings level 2.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-3 nil
   "General purpose face for use in headings level 3.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-4 nil
   "General purpose face for use in headings level 4.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-5 nil
   "General purpose face for use in headings level 5.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-6 nil
   "General purpose face for use in headings level 6.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-7 nil
   "General purpose face for use in headings level 7.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-heading-8 nil
   "General purpose face for use in headings level 8.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-headings' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-hl-line nil
   "General purpose face for the current line.
-The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-hl-line' variable.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-hl-line' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
@@ -1414,97 +1404,97 @@ The actual styling of the face is done by 
`modus-themes-faces'.")
 
 (defface modus-themes-graph-red-0 nil
   "Special subdued red face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-red-1 nil
   "Special prominent red face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-green-0 nil
   "Special subdued green face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-green-1 nil
   "Special prominent green face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-yellow-0 nil
   "Special subdued yellow face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-yellow-1 nil
   "Special prominent yellow face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-blue-0 nil
   "Special subdued blue face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-blue-1 nil
   "Special prominent blue face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-magenta-0 nil
   "Special subdued magenta face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-magenta-1 nil
   "Special prominent magenta face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-cyan-0 nil
   "Special subdued cyan face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
 (defface modus-themes-graph-cyan-1 nil
   "Special prominent cyan face for use in graphs.
-This is intended to be applied in contexts such as the Org agenda habit
-graph where faithfulness to the semantics of a color value is of
-paramount importance.
+This is intended to be applied in contexts such as the Org agenda
+habit graph where faithfulness to the semantics of a color value
+is of paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
@@ -1553,11 +1543,21 @@ The actual styling of the face is done by 
`modus-themes-faces'.")
   "Generic face for key bindings.
 The actual styling of the face is done by `modus-themes-faces'.")
 
-
+(defface modus-themes-search-success nil
+  "Generic face for successful search.
+The actual styling of the face is done by `modus-themes-faces'.")
 
-;;; Customization options
+(defface modus-themes-search-success-modeline nil
+  "Generic mode line indicator for successful search.
+The actual styling of the face is done by `modus-themes-faces'.")
 
-;;;; Current customization options (>= 1.0.0)
+(defface modus-themes-search-success-lazy nil
+  "Generic face for successful, lazily highlighted search.
+The actual styling of the face is done by `modus-themes-faces'.")
+
+
+
+;;; Customization variables
 
 (defcustom modus-themes-operandi-color-overrides nil
   "Override colors in the Modus Operandi palette.
@@ -1934,28 +1934,43 @@ most intense combination of face properties."
 (defcustom modus-themes-org-blocks nil
   "Use a subtle gray or color-coded background for Org blocks.
 
-Nil means that the block will have no background of its own and
-will use the default that applies to the rest of the buffer.
-
-Option `grayscale' (or `greyscale') will apply a subtle neutral
-gray background to the block's contents.  It also affects the
-begin and end lines of the block: their background will be
-extended to the edge of the window for Emacs version >= 27 where
-the ':extend' keyword is recognized by `set-face-attribute'.
+Nil (the default) means that the block has no distinct background
+of its own and uses the one that applies to the rest of the
+buffer.
+
+Option `gray-background' applies a subtle gray background to the
+block's contents.  It also affects the begin and end lines of the
+block: their background extends to the edge of the window for
+Emacs version >= 27 where the ':extend' keyword is recognized by
+`set-face-attribute' (this is contingent on the variable
+`org-fontify-whole-block-delimiter-line').
+
+Option `tinted-background' uses a slightly colored background for
+the contents of the block.  The exact color will depend on the
+programming language and is controlled by the variable
+`org-src-block-faces' (refer to the theme's source code for the
+current association list).  For this to take effect, the Org
+buffer needs to be restarted with `org-mode-restart'.
+
+Code blocks use their major mode's colors only when the variable
+`org-src-fontify-natively' is non-nil.  While quote/verse blocks
+require setting `org-fontify-quote-and-verse-blocks' to a non-nil
+value.
 
-Option `rainbow' will use an accented background for the contents
-of the block.  The exact color will depend on the programming
-language and is controlled by the `org-src-block-faces'
-variable (refer to the theme's source code for the current
-association list)."
+Older versions of the themes provided options `grayscale' (or
+`greyscale') and `rainbow'.  Those will continue to work as they
+are aliases for `gray-background' and `tinted-background',
+respectively."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.0.0")
+  :package-version '(modus-themes . "1.4.0")
   :version "28.1"
   :type '(choice
           (const :format "[%v] %t\n" :tag "No Org block background (default)" 
nil)
-          (const :format "[%v] %t\n" :tag "Subtle gray block background" 
grayscale)
-          (const :format "[%v] %t\n" :tag "Subtle gray block background (alt 
spelling)" greyscale)
-          (const :format "[%v] %t\n" :tag "Color-coded background per 
programming language" rainbow))
+          (const :format "[%v] %t\n" :tag "Subtle gray block background" 
gray-background)
+          (const :format "[%v] %t\n" :tag "Alias for `gray-background'" 
grayscale) ; for backward compatibility
+          (const :format "[%v] %t\n" :tag "Alias for `gray-background'" 
greyscale)
+          (const :format "[%v] %t\n" :tag "Color-coded background per 
programming language" tinted-background)
+          (const :format "[%v] %t\n" :tag "Alias for `tinted-background'" 
rainbow)) ; back compat
   :link '(info-link "(modus-themes) Org mode blocks"))
 
 (defcustom modus-themes-org-habit nil
@@ -2000,19 +2015,19 @@ highlights the alert and overdue states."
   "Adjust the overall style of the mode line.
 
 The default (nil) is a two-dimensional rectangle with a border
-around it.  The active and the inactive modelines use different
+around it.  The active and the inactive mode lines use different
 shades of grayscale values for the background and foreground.
 
 A `3d' value will apply a three-dimensional effect to the active
-modeline.  The inactive modelines remain two-dimensional and are
-toned down a bit, relative to the nil value.
+mode line.  The inactive mode lines remain two-dimensional and
+are toned down a bit, relative to the nil value.
 
-The `moody' option is meant to optimize the modeline for use with
-the library of the same name.  This practically means to remove
-the box effect and rely on underline and overline properties
-instead.  It also tones down the inactive modelines.  Despite its
-intended purpose, this option can also be used without the
-`moody' library.
+The `moody' option is meant to optimize the mode line for use
+with the library of the same name.  This practically means to
+remove the box effect and rely on underline and overline
+properties instead.  It also tones down the inactive mode lines.
+Despite its intended purpose, this option can also be used
+without the `moody' library.
 
 The `borderless' option uses the same colors as the default (nil
 value), but removes the border effect.  This is done by making
@@ -2021,7 +2036,7 @@ effectively blending the two and creating some padding.
 
 The `borderless-3d' and `borderless-moody' approximate the `3d'
 and `moody' options respectively, while removing the borders.
-However, to ensure that the inactive modelines remain visible,
+However, to ensure that the inactive mode lines remain visible,
 they apply a slightly more prominent background to them than what
 their counterparts do (same inactive background as with the
 default).
@@ -2029,84 +2044,110 @@ default).
 Similarly, `accented', `accented-3d', and `accented-moody'
 correspond to the default (nil), `3d', and `moody' styles
 respectively, except that the active mode line uses a colored
-background instead of the standard shade of gray."
+background instead of the standard shade of gray.
+
+Same principle for styles `borderless-accented',
+`borderless-accented-3d', `borderless-accented-moody', which
+apply a colored background to the active mode line, while they
+remove any noticeable border around both the active and inactive
+the mode lines."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.3.0")
+  :package-version '(modus-themes . "1.4.0")
   :version "28.1"
   :type '(choice
           (const :format "[%v] %t\n" :tag "Two-dimensional box (default)" nil)
           (const :format "[%v] %t\n" :tag "Three-dimensional style for the 
active mode line" 3d)
           (const :format "[%v] %t\n" :tag "No box effects, which are optimal 
for use with the `moody' library" moody)
-          (const :format "[%v] %t\n" :tag "Like the default, but without 
border effects" borderless)
+          (const :format "[%v] %t\n" :tag "Like the default, but without 
discernible border effects" borderless)
           (const :format "[%v] %t\n" :tag "Like `3d', but without noticeable 
border" borderless-3d)
           (const :format "[%v] %t\n" :tag "Like `moody', but without 
noticeable border" borderless-moody)
           (const :format "[%v] %t\n" :tag "Two-dimensional box with a colored 
background" accented)
           (const :format "[%v] %t\n" :tag "Like `3d', but with a colored 
background" accented-3d)
-          (const :format "[%v] %t\n" :tag "Like `moody', but with a colored 
background" accented-moody))
+          (const :format "[%v] %t\n" :tag "Like `moody', but with a colored 
background" accented-moody)
+          (const :format "[%v] %t\n" :tag "Like `accented', but without a 
noticeable border" borderless-accented)
+          (const :format "[%v] %t\n" :tag "Like `accented-3d', but with a 
noticeable border" borderless-accented-3d)
+          (const :format "[%v] %t\n" :tag "Like `accented-moody', but with a 
noticeable border" borderless-accented-moody))
   :link '(info-link "(modus-themes) Mode line"))
 
 (defcustom modus-themes-diffs nil
-  "Adjust the overall styles of diffs.
-
-Nil means to use fairly intense color combinations for diffs.
-For example, you get a rich green background with a green
-foreground for added lines.  Word-wise or 'refined' diffs follow
-the same pattern but use different shades of those colors to
-remain distinct.
+  "Adjust the overall style of diffs.
 
-A `desaturated' value follows the same principles as with the nil
-option, while it tones down all relevant colors.
+The default (nil) uses fairly intense color combinations for
+diffs, by applying prominently colored backgrounds, with
+appropriate foregrounds.
 
-Option `fg-only' will remove all accented backgrounds, except
-from word-wise changes.  It instead uses color-coded foreground
-values to differentiate between added/removed/changed lines.  If
-a background is necessary, such as with `ediff', then a subtle
-grayscale value is used.
+Option `desaturated' follows the same principles as with the
+default (nil), though it tones down all relevant colors.
 
 Option `bg-only' applies a background but does not override the
 text's foreground.  This makes it suitable for a non-nil value
 passed to `diff-font-lock-syntax' (note: Magit does not support
-syntax highlighting in diffs as of 2020-11-25, version
-20201116.1057).
-
-Option `deuteranopia' accounts for red-green color defficiency by
-replacing all instances of green with colors on the blue side of
-the spectrum.  Other stylistic changes are made in the interest
-of optimizing for such a use-case."
+syntax highlighting in diffs---last checked on 2021-04-21).
+
+Option `deuteranopia' is like the default (nil) in terms of using
+prominently colored backgrounds, except that it also accounts for
+red-green color defficiency by replacing all instances of green
+with colors on the blue side of the spectrum.  Other stylistic
+changes are made in the interest of optimizing for such a
+use-case.
+
+Option `fg-only-deuteranopia' removes all colored backgrounds,
+except from word-wise or refined changes.  Instead, it only uses
+color-coded foreground values to differentiate between added,
+removed, and changed lines.  If a background is necessary to
+denote context, a subtle grayscale value is applied.  The color
+used for added lines is a variant of blue to account for
+red-green color defficiency but also because green text alone is
+hard to discern in the diff's context (hard for our accessibility
+purposes).  The `fg-only' option that existed in older versions
+of the themes is now an alias of `fg-only-deuteranopia', in the
+interest of backward compatibility."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.2.0")
+  :package-version '(modus-themes . "1.4.0")
   :version "28.1"
   :type '(choice
           (const :format "[%v] %t\n" :tag "Intensely colored backgrounds 
(default)" nil)
           (const :format "[%v] %t\n" :tag "Slightly accented backgrounds with 
tinted text" desaturated)
-          (const :format "[%v] %t\n" :tag "No backgrounds, except for refined 
diffs" fg-only)
           (const :format "[%v] %t\n" :tag "Apply color-coded backgrounds; keep 
syntax colors in tact" bg-only)
-          (const :format "[%v] %t\n" :tag "Optimized for red-green color 
defficiency" deuteranopia))
+          (const :format "[%v] %t\n" :tag "Like the default (nil), though 
optimized for red-green color defficiency" deuteranopia)
+          (const :format "[%v] %t\n" :tag "No backgrounds, except for refined 
diffs" fg-only-deuteranopia)
+          (const :format "[%v] %t\n" :tag "Alias of `fg-only-deuteranopia' for 
backward compatibility" fg-only))
   :link '(info-link "(modus-themes) Diffs"))
 
 (defcustom modus-themes-completions nil
-  "Apply special styles to the UI of completion frameworks.
-
-This concerns Icomplete, Ivy, Helm, Selectrum, Ido, as well as
-any other tool meant to enhance their experience.  The effect
-will vary depending on the completion framework.
-
-Nil means to remain faithful to the metaphors that each UI
-establishes.  For example, Icomplete and Ido only use foreground
-colors to style their matches, whereas Ivy or Helm rely on an
-aesthetic that combines colored backgrounds with appropriate text
-color.
-
-Option `moderate' will apply a combination of background and
-foreground that is fairly subtle.  For Icomplete and the like,
-this constitutes a departure from their standard style.  While
-Ivy, Helm, and the others, will use less pronounced colors for
-applicable contexts.
-
-Option `opinionated' will apply color combinations that refashion
-the completion UI.  So Icomplete et al will now use styles that
-resemble the defaults of Ivy and co., while the latter group will
-revert to an even more nuanced aesthetic."
+  "Control the style of the completion framework's interface.
+
+This is a special option that has different effects depending on
+the completion UI.  The interfaces can be grouped in two
+categories, based on their default aesthetics: (i) those that
+only or mostly use foreground colors for their interaction model,
+and (ii) those that combine background and foreground values for
+some of their metaphors.  The former category encompasses
+Icomplete, Ido, Selectrum, Vertico, as well as pattern matching
+styles like Orderless and Flx.  The latter covers Helm, Ivy, and
+Sallet.
+
+A value of nil (the default) will simply respect the metaphors of
+each completion framework.
+
+Option `moderate' applies a combination of background and
+foreground that is fairly subtle.  For Icomplete and friends this
+constitutes a departure from their default aesthetics, however
+the difference is small.  While Helm, Ivy et al appear slightly
+different than their original looks, as they are toned down a
+bit.
+
+Option `opinionated' uses color combinations that refashion the
+completion UI.  For the Icomplete camp this means that intense
+background and foreground combinations are used: in effect their
+looks emulate those of Helm, Ivy and company in their original
+style.  Whereas the other group of packages will revert to an
+even more nuanced aesthetic with some additional changes to the
+choice of hues.
+
+To appreciate the scope of this customization option, you should
+spend some time with every one of the nil (default), `moderate',
+and `opinionated' possibilities."
   :group 'modus-themes
   :package-version '(modus-themes . "1.0.0")
   :version "28.1"
@@ -2164,7 +2205,8 @@ current line.
 
 Option `intense-background' uses a prominent neutral background.
 
-Option `accented-background' uses a subtle colored background.
+Option `accented-background' is like the `intense-background' but
+with a more colorful background.
 
 Option `underline-neutral' combines a subtle neutral background
 with a gray underline.
@@ -2181,7 +2223,7 @@ without any added change to the background.
 Set `x-underline-at-descent-line' to a non-nil value for better
 results with underlines."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.3.0")
+  :package-version '(modus-themes . "1.4.0")
   :version "28.1"
   :type '(choice
           (const :format "[%v] %t\n" :tag "Subtle neutral background 
(default)" nil)
@@ -2340,83 +2382,45 @@ to the end of each line within the region."
           (const :format "[%v] %t\n" :tag "As with the `accent' option, but 
does not extend" accent-no-extend))
   :link '(info-link "(modus-themes) Active region"))
 
-
+(defcustom modus-themes-success-deuteranopia nil
+  "Color-code 'success' or 'done' as blue instead of green.
 
-;;;; Deprecated customization options (prior to 1.0.0)
-
-;;;;; Modus Operandi obsolete options
-
-(make-obsolete 'modus-operandi-theme-override-colors-alist nil "1.0.0")
-(make-obsolete 'modus-operandi-theme-slanted-constructs 
'modus-themes-slanted-constructs "1.0.0")
-(make-obsolete 'modus-operandi-theme-bold-constructs 
'modus-themes-bold-constructs "1.0.0")
-(make-obsolete 'modus-operandi-theme-proportional-fonts 
'modus-themes-variable-pitch-headings "1.0.0")
-(make-obsolete 'modus-operandi-theme-variable-pitch-headings 
'modus-themes-variable-pitch-headings "1.0.0")
-(make-obsolete 'modus-operandi-theme-no-mixed-fonts 
'modus-themes-no-mixed-fonts "1.0.0")
-(make-obsolete 'modus-operandi-theme-rainbow-headings 'modus-themes-headings 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-section-headings 'modus-themes-headings 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-headings 'modus-themes-headings "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-headings 
'modus-themes-scale-headings "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-1 'modus-themes-scale-1 "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-2 'modus-themes-scale-2 "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-3 'modus-themes-scale-3 "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-4 'modus-themes-scale-4 "1.0.0")
-(make-obsolete 'modus-operandi-theme-scale-5 'modus-themes-scale-5 "1.0.0")
-(make-obsolete 'modus-operandi-theme-visible-fringes 'modus-themes-fringes 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-fringes 'modus-themes-fringes "1.0.0")
-(make-obsolete 'modus-operandi-theme-distinct-org-blocks 
'modus-themes-org-blocks "1.0.0")
-(make-obsolete 'modus-operandi-theme-rainbow-org-src-blocks 
'modus-themes-org-blocks "1.0.0")
-(make-obsolete 'modus-operandi-theme-org-blocks 'modus-themes-org-blocks 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-3d-modeline 'modus-themes-mode-line 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-mode-line 'modus-themes-mode-line "1.0.0")
-(make-obsolete 'modus-operandi-theme-subtle-diffs 'modus-themes-diffs "1.0.0")
-(make-obsolete 'modus-operandi-theme-diffs 'modus-themes-diffs "1.0.0")
-(make-obsolete 'modus-operandi-theme-intense-standard-completions 
'modus-themes-completions "1.0.0")
-(make-obsolete 'modus-operandi-theme-completions 'modus-themes-completions 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-prompts 'modus-themes-prompts "1.0.0")
-(make-obsolete 'modus-operandi-theme-intense-hl-line 
'modus-themes-intense-hl-line "1.0.0")
-(make-obsolete 'modus-operandi-theme-intense-paren-match 
'modus-themes-paren-match "1.0.0")
-(make-obsolete 'modus-operandi-theme-faint-syntax 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-operandi-theme-comments 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-operandi-theme-syntax 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-operandi-theme-no-link-underline 'modus-themes-links 
"1.0.0")
-(make-obsolete 'modus-operandi-theme-links 'modus-themes-links "1.0.0")
-
-;;;;; Modus Vivendi obsolete options
-
-(make-obsolete 'modus-vivendi-theme-override-colors-alist nil "1.0.0")
-(make-obsolete 'modus-vivendi-theme-slanted-constructs 
'modus-themes-slanted-constructs "1.0.0")
-(make-obsolete 'modus-vivendi-theme-bold-constructs 
'modus-themes-bold-constructs "1.0.0")
-(make-obsolete 'modus-vivendi-theme-proportional-fonts 
'modus-themes-variable-pitch-headings "1.0.0")
-(make-obsolete 'modus-vivendi-theme-variable-pitch-headings 
'modus-themes-variable-pitch-headings "1.0.0")
-(make-obsolete 'modus-vivendi-theme-no-mixed-fonts 
'modus-themes-no-mixed-fonts "1.0.0")
-(make-obsolete 'modus-vivendi-theme-rainbow-headings 'modus-themes-headings 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-section-headings 'modus-themes-headings 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-headings 'modus-themes-headings "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-headings 
'modus-themes-scale-headings "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-1 'modus-themes-scale-1 "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-2 'modus-themes-scale-2 "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-3 'modus-themes-scale-3 "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-4 'modus-themes-scale-4 "1.0.0")
-(make-obsolete 'modus-vivendi-theme-scale-5 'modus-themes-scale-5 "1.0.0")
-(make-obsolete 'modus-vivendi-theme-visible-fringes 'modus-themes-fringes 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-fringes 'modus-themes-fringes "1.0.0")
-(make-obsolete 'modus-vivendi-theme-distinct-org-blocks 
'modus-themes-org-blocks "1.0.0")
-(make-obsolete 'modus-vivendi-theme-rainbow-org-src-blocks 
'modus-themes-org-blocks "1.0.0")
-(make-obsolete 'modus-vivendi-theme-org-blocks 'modus-themes-org-blocks 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-3d-modeline 'modus-themes-mode-line 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-mode-line 'modus-themes-mode-line "1.0.0")
-(make-obsolete 'modus-vivendi-theme-subtle-diffs 'modus-themes-diffs "1.0.0")
-(make-obsolete 'modus-vivendi-theme-diffs 'modus-themes-diffs "1.0.0")
-(make-obsolete 'modus-vivendi-theme-intense-standard-completions 
'modus-themes-completions "1.0.0")
-(make-obsolete 'modus-vivendi-theme-completions 'modus-themes-completions 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-prompts 'modus-themes-prompts "1.0.0")
-(make-obsolete 'modus-vivendi-theme-intense-hl-line 
'modus-themes-intense-hl-line "1.0.0")
-(make-obsolete 'modus-vivendi-theme-intense-paren-match 
'modus-themes-paren-match "1.0.0")
-(make-obsolete 'modus-vivendi-theme-faint-syntax 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-vivendi-theme-comments 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-vivendi-theme-syntax 'modus-themes-syntax "1.0.0")
-(make-obsolete 'modus-vivendi-theme-no-link-underline 'modus-themes-links 
"1.0.0")
-(make-obsolete 'modus-vivendi-theme-links 'modus-themes-links "1.0.0")
+This is to account for red-green color deficiency.
+
+The present customization option should apply to all contexts where
+there can be a color-coded distinction between success and failure,
+to-do and done, and so on.
+
+Diffs, which have a red/green dichotomy by default, can also be
+configured to conform with deuteranopia: `modus-themes-diffs'."
+  :group 'modus-themes
+  :package-version '(modus-themes . "1.4.0")
+  :version "28.1"
+  :type 'boolean
+  :link '(info-link "(modus-themes) Success' color-code"))
+
+(defcustom modus-themes-mail-citations nil
+  "Control the color of citations in messages or email clients.
+
+Nil (the default) means to use a variety of contrasting hues to
+denote depth in nested citations.  Colors are fairly easy to tell
+apart.
+
+Option `faint' maintains a color-based distinction between
+citation levels but the colors it applies have very subtle
+differences between them.
+
+Option `monochrome' turns all citations that would otherwise be
+colored into a uniform shade of shade of gray."
+  :group 'modus-themes
+  :package-version '(modus-themes . "1.4.0")
+  :version "28.1"
+  :type '(choice
+          (const :format "[%v] %t\n" :tag "Colorful mail citations with 
contrasting hues (default)" nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but with less 
saturated colors" faint)
+          (const :format "[%v] %t\n" :tag "Deprecated alias of `faint'" 
desaturated)
+          (const :format "[%v] %t\n" :tag "Uniformly gray mail citations" 
monochrome))
+  :link '(info-link "(modus-themes) Mail citations"))
 
 
 
@@ -2464,7 +2468,7 @@ Those are stored in `modus-themes-faces' and
   (car custom-enabled-themes))
 
 ;; Helper functions that are meant to ease the implementation of the
-;; above customization options.
+;; above customization variables.
 (defun modus-themes--bold-weight ()
   "Conditional use of a heavier text weight."
   (when modus-themes-bold-constructs
@@ -2629,7 +2633,7 @@ than the default.  BG is a nuanced, typically accented,
 background that can work well with either of the foreground
 values.  BORDER is a color value that combines well with the
 background and alternative foreground."
-  (let* ((key (modus-themes--heading-p `,level))
+  (let* ((key (modus-themes--heading-p level))
          (style (or key (modus-themes--heading-p t)))
          (var (when modus-themes-variable-pitch-headings
                 'variable-pitch))
@@ -2638,55 +2642,58 @@ background and alternative foreground."
                     'bold)))
     (pcase style
       ('no-bold
-       (list :inherit `,var :foreground fg))
+       (list :inherit var :foreground fg))
       ('no-color
-       (list :inherit `,varbold))
+       (list :inherit varbold))
       ('no-color-no-bold
-       (list :inherit `,var))
+       (list :inherit var))
       ('line
-       (list :inherit `,varbold :foreground fg :overline border))
+       (list :inherit varbold :foreground fg :overline border))
       ('line-no-bold
-       (list :inherit `,var :foreground fg :overline border))
+       (list :inherit var :foreground fg :overline border))
       ('rainbow
-       (list :inherit `,varbold :foreground fg-alt))
+       (list :inherit varbold :foreground fg-alt))
       ('rainbow-no-bold
-       (list :inherit `,var :foreground fg-alt))
+       (list :inherit var :foreground fg-alt))
       ('rainbow-line
-       (list :inherit `,varbold :foreground fg-alt :overline border))
+       (list :inherit varbold :foreground fg-alt :overline border))
       ('rainbow-line-no-bold
-       (list :inherit `,var :foreground fg-alt :overline border))
+       (list :inherit var :foreground fg-alt :overline border))
       ('highlight
-       (list :inherit `,varbold :background bg :foreground fg))
+       (list :inherit varbold :background bg :foreground fg))
       ('highlight-no-bold
-       (list :inherit `,var :background bg :foreground fg))
+       (list :inherit var :background bg :foreground fg))
       ('rainbow-highlight
-       (list :inherit `,varbold :background bg :foreground fg-alt))
+       (list :inherit varbold :background bg :foreground fg-alt))
       ('rainbow-highlight-no-bold
-       (list :inherit `,var :background bg :foreground fg-alt))
+       (list :inherit var :background bg :foreground fg-alt))
       ('section
-       (list :inherit `,varbold :background bg :foreground fg :overline border 
:extend t))
+       (list :inherit varbold :background bg :foreground fg :overline border 
:extend t))
       ('section-no-bold
-       (list :inherit `,var :background bg :foreground fg :overline border 
:extend t))
+       (list :inherit var :background bg :foreground fg :overline border 
:extend t))
       ('rainbow-section
-       (list :inherit `,varbold :background bg :foreground fg-alt :overline 
border :extend t))
+       (list :inherit varbold :background bg :foreground fg-alt :overline 
border :extend t))
       ('rainbow-section-no-bold
-       (list :inherit `,var :background bg :foreground fg-alt :overline border 
:extend t))
+       (list :inherit var :background bg :foreground fg-alt :overline border 
:extend t))
       (_
-       (list :inherit `,varbold :foreground fg)))))
+       (list :inherit varbold :foreground fg)))))
 
-(defun modus-themes--org-block (bgblk)
+(defun modus-themes--org-block (bgblk fgdefault &optional fgblk)
   "Conditionally set the background of Org blocks.
 BGBLK applies to a distinct neutral background.  Else blocks have
 no background of their own (the default), so they look the same
-as the rest of the buffer.
-
-`modus-themes-org-blocks' also accepts a `rainbow' option
-which is applied conditionally to `org-src-block-faces' (see the
-theme's source code)."
-  (if (or (eq modus-themes-org-blocks 'grayscale)
+as the rest of the buffer.  FGDEFAULT is used when no distinct
+background is present.  While optional FGBLK specifies a
+foreground value that can be combined with BGBLK.
+
+`modus-themes-org-blocks' also accepts `tinted-background' (alias
+`rainbow') as a value which applies to `org-src-block-faces' (see
+the theme's source code)."
+  (if (or (eq modus-themes-org-blocks 'gray-background)
+          (eq modus-themes-org-blocks 'grayscale)
           (eq modus-themes-org-blocks 'greyscale))
-      (list :background bgblk :extend t)
-    (list :background 'unspecified)))
+      (list :background bgblk :foreground (or fgblk fgdefault) :extend t)
+    (list :background 'unspecified :foreground fgdefault)))
 
 (defun modus-themes--org-block-delim (bgaccent fgaccent bg fg)
   "Conditionally set the styles of Org block delimiters.
@@ -2702,6 +2709,7 @@ The latter pair should be more subtle than the background 
of the
 block, as it is used when `modus-themes-org-blocks' is
 set to `rainbow'."
   (pcase modus-themes-org-blocks
+    ('gray-background (list :background bg :foreground fg :extend t))
     ('grayscale (list :background bg :foreground fg :extend t))
     ('greyscale (list :background bg :foreground fg :extend t))
     ('rainbow (list :background bgaccent :foreground fgaccent))
@@ -2721,9 +2729,9 @@ instead.  Same for SIMPLE."
   "Color combinations for `modus-themes-mode-line'.
 
 FG and BG are the default colors.  FG-ALT and BG-ALT are meant to
-accommodate the options for a 3D modeline or a `moody' compliant
+accommodate the options for a 3D mode line or a `moody' compliant
 one.  FG-ACCENT and BG-ACCENT are used for all variants.  BORDER
-applies to all permutations of the modeline, except the
+applies to all permutations of the mode line, except the
 three-dimensional effect, where BORDER-3D is used instead.
 
 Optional ALT-STYLE applies an appropriate style to the mode
@@ -2737,38 +2745,49 @@ values.  It is intended to be used as a 
distant-foreground
 property."
   (pcase modus-themes-mode-line
     ('3d
-     `(:background ,bg-alt :foreground ,fg-alt
-       :box (:line-width ,(or border-width 1)
-             :color ,border-3d
-             :style ,(and alt-style 'released-button))))
+     `( :background ,bg-alt :foreground ,fg-alt
+        :box ( :line-width ,(or border-width 1)
+               :color ,border-3d
+               :style ,(and alt-style 'released-button))))
     ('moody
-     `(:background ,bg-alt :foreground ,fg-alt
-       :underline ,border :overline ,border
-       :distant-foreground ,fg-distant))
+     `( :background ,bg-alt :foreground ,fg-alt
+        :underline ,border :overline ,border
+        :distant-foreground ,fg-distant))
     ('borderless
-     `(:foreground ,fg :background ,bg :box ,bg))
+     `(:background ,bg :foreground ,fg :box ,bg))
     ('borderless-3d
-     `(:foreground ,fg :background ,bg
-       :box (:line-width ,(or border-width 1)
-             :color ,bg
-             :style ,(and alt-style 'released-button))))
+     `( :background ,bg :foreground ,fg
+        :box ( :line-width ,(or border-width 1)
+               :color ,bg
+               :style ,(and alt-style 'released-button))))
     ('borderless-moody
-     `(:background ,bg :foreground ,fg
-       :underline ,bg :overline ,bg
-       :distant-foreground ,fg-distant))
+     `( :background ,bg :foreground ,fg
+        :underline ,bg :overline ,bg
+        :distant-foreground ,fg-distant))
     ('accented
-     `(:foreground ,fg-accent :background ,bg-accent :box ,border))
+     `(:background ,bg-accent :foreground ,fg-accent :box ,border))
     ('accented-3d
-     `(:background ,bg-accent :foreground ,fg-accent
-       :box (:line-width ,(or border-width 1)
-             :color ,border-3d
-             :style ,(and alt-style 'released-button))))
+     `( :background ,bg-accent :foreground ,fg-accent
+        :box ( :line-width ,(or border-width 1)
+               :color ,border-3d
+               :style ,(and alt-style 'released-button))))
     ('accented-moody
-     `(:background ,bg-accent :foreground ,fg-accent
-       :underline ,border :overline ,border
-       :distant-foreground ,fg-distant))
+     `( :background ,bg-accent :foreground ,fg-accent
+        :underline ,border :overline ,border
+        :distant-foreground ,fg-distant))
+    ('borderless-accented
+     `(:background ,bg-accent :foreground ,fg-accent :box ,bg-accent))
+    ('borderless-accented-3d
+     `( :background ,bg-accent :foreground ,fg-accent
+        :box ( :line-width ,(or border-width 1)
+               :color ,bg-accent
+               :style ,(and alt-style 'released-button))))
+    ('borderless-accented-moody
+     `( :background ,bg-accent :foreground ,fg-accent
+        :underline ,bg-accent :overline ,bg-accent
+        :distant-foreground ,fg-distant))
     (_
-     `(:foreground ,fg :background ,bg :box ,border))))
+     `(:background ,bg :foreground ,fg :box ,border))))
 
 (defun modus-themes--diff
     (fg-only-bg fg-only-fg mainbg mainfg altbg altfg &optional deuteranbg 
deuteranfg  bg-only-fg)
@@ -2792,6 +2811,7 @@ Optional BG-ONLY-FG applies ALTFG else leaves the 
foreground
 unspecified."
   (pcase modus-themes-diffs
     ('fg-only (list :background fg-only-bg :foreground fg-only-fg))
+    ('fg-only-deuteranopia (list :background fg-only-bg :foreground 
fg-only-fg))
     ('desaturated (list :background altbg :foreground altfg))
     ('deuteranopia (list :background (or deuteranbg mainbg) :foreground (or 
deuteranfg mainfg)))
     ('bg-only (list :background altbg :foreground (if bg-only-fg altfg 
'unspecified)))
@@ -2801,19 +2821,17 @@ unspecified."
   "Determine whether the DEUTERAN or MAIN color should be used.
 This is based on whether `modus-themes-diffs' has the value
 `deuteranopia'."
-  (if (eq modus-themes-diffs 'deuteranopia)
+  (if (or (eq modus-themes-diffs 'deuteranopia)
+          (eq modus-themes-diffs 'fg-only-deuteranopia)
+          (eq modus-themes-diffs 'fg-only))
       (list deuteran)
     (list main)))
 
-(defun modus-themes--diff-text (fg-only-fg default-fg)
-  "Like `modus-themes--diff', but only for foregrounds.
-FG-ONLY-FG is the foreground that is used when diffs are styled
-using only foreground colors.  DEFAULT-FG covers all other
-cases."
-  (pcase modus-themes-diffs
-    ('fg-only (list :foreground fg-only-fg))
-    ('bg-only (list :foreground 'unspecified))
-    (_ (list :foreground default-fg))))
+(defun modus-themes--success-deuteran (deuteran main)
+  "Determine whether to color-code success as DEUTERAN or MAIN."
+  (if modus-themes-success-deuteranopia
+      (list deuteran)
+    (list main)))
 
 (defun modus-themes--standard-completions (mainfg subtlebg intensebg intensefg)
   "Combinations for `modus-themes-completions'.
@@ -2895,24 +2913,36 @@ background that combines well with FG."
     ('accent-no-extend (list :background bgaccent :foreground fg :extend nil))
     (_ (list :background bg :foreground fg))))
 
-(defun modus-themes--hl-line (bgdefault bgintense bgaccent lineneutral 
lineaccent)
+(defun modus-themes--hl-line (bgdefault bgintense bgaccent bgaccentul 
lineneutral lineaccent)
   "Apply `modus-themes-hl-line' styles.
 
 BGDEFAULT is a subtle neutral background.  BGINTENSE is like the
-default, but more prominent.  BGACCENT is a subtle accented
-background.  LINENEUTRAL and LINEACCENT are a color values that
-can remain distinct against the buffer's possible backgrounds:
-the former is neutral, the latter is accented.  LINEONLY must be
-a prominent neutral color."
+default, but more prominent.  BGACCENT is a prominent accented
+background, while BGACCENTUL is more subtle and is meant to be
+used in tandem with an underline.  LINENEUTRAL and LINEACCENT are
+a color values that can remain distinct against the buffer's
+possible backgrounds: the former is neutral, the latter is
+accented."
   (pcase modus-themes-hl-line
     ('intense-background (list :background bgintense))
     ('accented-background (list :background bgaccent))
     ('underline-neutral (list :background bgdefault :underline lineneutral))
-    ('underline-accented (list :background bgaccent :underline lineaccent))
+    ('underline-accented (list :background bgaccentul :underline lineaccent))
     ('underline-only-neutral (list :background 'unspecified :underline 
lineneutral))
     ('underline-only-accented (list :background 'unspecified :underline 
lineaccent))
     (_ (list :background bgdefault))))
 
+(defun modus-themes--mail-cite (mainfg subtlefg)
+  "Combinations for `modus-themes-mail-citations'.
+
+MAINFG is an accented foreground value.  SUBTLEFG is its
+desaturated counterpart."
+  (pcase modus-themes-mail-citations
+    ('monochrome (list :inherit 'shadow))
+    ('faint (list :foreground subtlefg))
+    ('desaturated (list :foreground subtlefg))
+    (_ (list :foreground mainfg))))
+
 
 
 ;;;; Utilities for DIY users
@@ -3132,7 +3162,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     ;; intended for `diff-mode' or equivalent
     `(modus-themes-diff-added
       ((,class ,@(modus-themes--diff
-                  bg-main green
+                  bg-main blue-alt-other
                   bg-diff-focus-added fg-diff-focus-added
                   green-nuanced-bg fg-diff-added
                   bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
@@ -3148,7 +3178,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   red-nuanced-bg fg-diff-removed))))
     `(modus-themes-diff-refine-added
       ((,class ,@(modus-themes--diff
-                  bg-diff-added fg-diff-added
+                  bg-diff-added-deuteran fg-diff-added-deuteran
                   bg-diff-refine-added fg-diff-refine-added
                   bg-diff-focus-added fg-diff-focus-added
                   bg-diff-refine-added-deuteran 
fg-diff-refine-added-deuteran))))
@@ -3164,7 +3194,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   bg-diff-focus-removed fg-diff-focus-removed))))
     `(modus-themes-diff-focus-added
       ((,class ,@(modus-themes--diff
-                  bg-dim green
+                  bg-dim blue-alt-other
                   bg-diff-focus-added fg-diff-focus-added
                   bg-diff-added fg-diff-added
                   bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
@@ -3180,7 +3210,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   bg-diff-removed fg-diff-removed))))
     `(modus-themes-diff-heading
       ((,class ,@(modus-themes--diff
-                  bg-main blue
+                  bg-alt fg-main
                   bg-diff-heading fg-diff-heading
                   cyan-nuanced-bg cyan-nuanced-fg
                   bg-header fg-main
@@ -3221,7 +3251,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   7 red-nuanced-fg red-alt red-nuanced-bg bg-region))))
     `(modus-themes-heading-8
       ((,class ,@(modus-themes--heading
-                  8 fg-dim magenta bg-alt bg-region))))
+                  8 magenta-nuanced-fg magenta bg-alt bg-region))))
 ;;;;; graph-specific faces
     `(modus-themes-graph-red-0 ((,class :background ,red-graph-0-bg)))
     `(modus-themes-graph-red-1 ((,class :background ,red-graph-1-bg)))
@@ -3236,21 +3266,41 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(modus-themes-graph-cyan-0 ((,class :background ,cyan-graph-0-bg)))
     `(modus-themes-graph-cyan-1 ((,class :background ,cyan-graph-1-bg)))
 ;;;;; language checkers
-    `(modus-themes-lang-error ((,class ,@(modus-themes--lang-check 
fg-lang-underline-error fg-lang-error red red-nuanced-bg))))
-    `(modus-themes-lang-note ((,class ,@(modus-themes--lang-check 
fg-lang-underline-note fg-lang-note blue-alt blue-nuanced-bg))))
-    `(modus-themes-lang-warning ((,class ,@(modus-themes--lang-check 
fg-lang-underline-warning fg-lang-warning yellow yellow-nuanced-bg))))
+    `(modus-themes-lang-error ((,class ,@(modus-themes--lang-check
+                                          fg-lang-underline-error
+                                          fg-lang-error
+                                          red red-nuanced-bg))))
+    `(modus-themes-lang-note ((,class ,@(modus-themes--lang-check
+                                         fg-lang-underline-note
+                                         fg-lang-note
+                                         blue-alt blue-nuanced-bg))))
+    `(modus-themes-lang-warning ((,class ,@(modus-themes--lang-check
+                                            fg-lang-underline-warning
+                                            fg-lang-warning
+                                            yellow yellow-nuanced-bg))))
 ;;;;; other custom faces
     `(modus-themes-bold ((,class ,@(modus-themes--bold-weight))))
-    `(modus-themes-hl-line ((,class ,@(modus-themes--hl-line bg-hl-line 
bg-hl-line-intense blue-nuanced-bg
-                                                             bg-region 
blue-intense-bg)
+    `(modus-themes-hl-line ((,class ,@(modus-themes--hl-line
+                                       bg-hl-line bg-hl-line-intense
+                                       bg-hl-line-intense-accent 
blue-nuanced-bg
+                                       bg-region blue-intense-bg)
                                     :extend t)))
     `(modus-themes-key-binding ((,class :inherit bold :foreground 
,blue-alt-other)))
-    `(modus-themes-slant ((,class :inherit italic :slant 
,@(modus-themes--slant))))
-    `(modus-themes-variable-pitch ((,class ,@(modus-themes--variable-pitch))))
+    `(modus-themes-reset-hard ((,class :inherit (fixed-pitch 
modus-themes-reset-soft))))
     `(modus-themes-reset-soft ((,class :background ,bg-main :foreground 
,fg-main
                                        :weight normal :slant normal 
:strike-through nil
                                        :box nil :underline nil :overline nil 
:extend nil)))
-    `(modus-themes-reset-hard ((,class :inherit (fixed-pitch 
modus-themes-reset-soft))))
+    `(modus-themes-search-success ((,class :inherit 
,@(modus-themes--success-deuteran
+                                                       
'modus-themes-intense-blue
+                                                       
'modus-themes-intense-green))))
+    `(modus-themes-search-success-lazy ((,class :inherit 
,@(modus-themes--success-deuteran
+                                                            
'modus-themes-special-mild
+                                                            
'modus-themes-refine-cyan))))
+    `(modus-themes-search-success-modeline ((,class :foreground 
,@(modus-themes--success-deuteran
+                                                                   blue-active
+                                                                   
green-active))))
+    `(modus-themes-slant ((,class :inherit italic :slant 
,@(modus-themes--slant))))
+    `(modus-themes-variable-pitch ((,class ,@(modus-themes--variable-pitch))))
 ;;;; standard faces
 ;;;;; absolute essentials
     `(default ((,class :background ,bg-main :foreground ,fg-main)))
@@ -3293,7 +3343,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(region ((,class ,@(modus-themes--region bg-region fg-main 
bg-hl-alt-intense bg-region-accent))))
     `(secondary-selection ((,class :inherit modus-themes-special-cold)))
     `(shadow ((,class :foreground ,fg-alt)))
-    `(success ((,class :inherit bold :foreground ,green)))
+    `(success ((,class :inherit bold :foreground 
,@(modus-themes--success-deuteran blue green))))
     `(trailing-whitespace ((,class :background ,red-intense-bg)))
     `(warning ((,class :inherit bold :foreground ,yellow)))
 ;;;;; buttons, links, widgets
@@ -3304,10 +3354,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                             ,@(modus-themes--link-color
                                magenta-alt-other magenta-alt-other-faint 
fg-alt))))
     `(tooltip ((,class :background ,bg-special-cold :foreground ,fg-main)))
-    `(widget-button ((,class :inherit button)))
-    `(widget-button-pressed ((,class :inherit button
-                                     ,@(modus-themes--link-color
-                                        magenta magenta-faint))))
+    `(widget-button ((,class :inherit bold :foreground ,blue-alt)))
+    `(widget-button-pressed ((,class :inherit widget-button :foreground 
,magenta)))
     `(widget-documentation ((,class :foreground ,green)))
     `(widget-field ((,class :background ,bg-alt :foreground ,fg-dim)))
     `(widget-inactive ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
@@ -3364,12 +3412,12 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(annotate-highlight-secondary ((,class :background ,green-nuanced-bg 
:underline ,green-intense)))
 ;;;;; anzu
     `(anzu-match-1 ((,class :inherit modus-themes-subtle-cyan)))
-    `(anzu-match-2 ((,class :inherit modus-themes-subtle-green)))
+    `(anzu-match-2 ((,class :inherit modus-themes-search-success)))
     `(anzu-match-3 ((,class :inherit modus-themes-subtle-yellow)))
-    `(anzu-mode-line ((,class :inherit bold :foreground ,green-active)))
+    `(anzu-mode-line ((,class :inherit (bold 
modus-themes-search-success-modeline))))
     `(anzu-mode-line-no-match ((,class :inherit bold :foreground ,red-active)))
     `(anzu-replace-highlight ((,class :inherit modus-themes-refine-yellow 
:underline t)))
-    `(anzu-replace-to ((,class :inherit (modus-themes-intense-green bold))))
+    `(anzu-replace-to ((,class :inherit (modus-themes-search-success bold))))
 ;;;;; apropos
     `(apropos-function-button ((,class :inherit button
                                        ,@(modus-themes--link-color
@@ -3485,6 +3533,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(boon-modeline-ins ((,class :inherit modus-themes-active-red)))
     `(boon-modeline-off ((,class :inherit modus-themes-active-yellow)))
     `(boon-modeline-spc ((,class :inherit modus-themes-active-green)))
+;;;;; bookmark
+    `(bookmark-face ((,class :inherit modus-themes-special-warm :extend t)))
 ;;;;; breakpoint (built-in gdb-mi.el)
     `(breakpoint-disabled ((,class :inherit shadow)))
     `(breakpoint-enabled ((,class :inherit bold :foreground ,red)))
@@ -3524,7 +3574,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cfw:face-toolbar-button-on ((,class :inherit bold :background 
,blue-nuanced-bg
                                           :foreground ,blue-alt)))
 ;;;;; centaur-tabs
-    `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-accent)))
+    `(centaur-tabs-active-bar-face ((,class :background ,blue-active)))
     `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground 
,red-active :underline t)))
     `(centaur-tabs-close-selected ((,class :inherit centaur-tabs-selected)))
     `(centaur-tabs-close-unselected ((,class :inherit 
centaur-tabs-unselected)))
@@ -3584,7 +3634,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                                        :background ,bg-alt 
:foreground ,fg-alt)))
     `(cider-test-error-face ((,class :inherit modus-themes-subtle-red)))
     `(cider-test-failure-face ((,class :inherit (modus-themes-intense-red 
bold))))
-    `(cider-test-success-face ((,class :inherit modus-themes-intense-green)))
+    `(cider-test-success-face ((,class :inherit 
,@(modus-themes--success-deuteran
+                                                   'modus-themes-intense-blue
+                                                   
'modus-themes-intense-green))))
     `(cider-traced-face ((,class :box (:line-width -1 :color ,cyan :style nil) 
:background ,bg-dim)))
     `(cider-warning-highlight-face ((,class :foreground ,yellow :underline t)))
 ;;;;; circe (and lui)
@@ -3626,8 +3678,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(company-tooltip-common ((,class :inherit bold :foreground ,blue-alt)))
     `(company-tooltip-common-selection ((,class :foreground ,fg-main)))
     `(company-tooltip-mouse ((,class :inherit modus-themes-intense-blue)))
-    `(company-tooltip-search ((,class :inherit (modus-themes-refine-cyan 
bold))))
-    `(company-tooltip-search-selection ((,class :inherit 
(modus-themes-intense-green bold) :underline t)))
+    `(company-tooltip-search ((,class :inherit 
(modus-themes-search-success-lazy bold))))
+    `(company-tooltip-search-selection ((,class :inherit 
(modus-themes-search-success bold) :underline t)))
     `(company-tooltip-selection ((,class :inherit (modus-themes-subtle-cyan 
bold))))
 ;;;;; company-posframe
     `(company-posframe-active-backend-name ((,class :inherit bold :background 
,bg-active :foreground ,blue-active)))
@@ -3665,10 +3717,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(consult-preview-error ((,class :inherit modus-themes-intense-red)))
     `(consult-preview-line ((,class :background ,bg-hl-alt-intense)))
 ;;;;; corfu
-    `(corfu-background ((,class :background ,bg-alt :foreground ,fg-alt)))
+    `(corfu-background ((,class :background ,bg-alt)))
     `(corfu-current ((,class :inherit bold :background ,cyan-subtle-bg)))
-    `(corfu-bar ((,class :background ,fg-alt :foreground ,fg-alt)))
-    `(corfu-border ((,class :background ,bg-active :foreground ,bg-region)))
+    `(corfu-bar ((,class :background ,fg-alt)))
+    `(corfu-border ((,class :background ,bg-active)))
 ;;;;; counsel
     `(counsel-active-mode ((,class :foreground ,magenta-alt-other)))
     `(counsel-application-name ((,class :foreground ,red-alt-other)))
@@ -3690,11 +3742,6 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(counsel-css-selector-depth-face-4 ((,class :foreground ,yellow)))
     `(counsel-css-selector-depth-face-5 ((,class :foreground ,magenta)))
     `(counsel-css-selector-depth-face-6 ((,class :foreground ,red)))
-;;;;; counsel-notmuch
-    `(counsel-notmuch-count-face ((,class :foreground ,cyan)))
-    `(counsel-notmuch-date-face ((,class :foreground ,blue)))
-    `(counsel-notmuch-people-face ((,class :foreground ,magenta)))
-    `(counsel-notmuch-subject-face ((,class :foreground ,magenta-alt-other)))
 ;;;;; counsel-org-capture-string
     `(counsel-org-capture-string-template-body-face ((,class :foreground 
,fg-special-cold)))
 ;;;;; cov
@@ -3709,11 +3756,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cperl-array-face ((,class :inherit font-lock-keyword-face)))
     `(cperl-hash-face ((,class :inherit font-lock-variable-name-face)))
 ;;;;; csv-mode
-    `(csv-separator-face ((,class :background ,bg-special-cold :foreground 
,fg-main)))
+    `(csv-separator-face ((,class :foreground ,red-intense)))
 ;;;;; ctrlf
-    `(ctrlf-highlight-active ((,class :inherit (modus-themes-intense-green 
bold))))
+    `(ctrlf-highlight-active ((,class :inherit (modus-themes-search-success 
bold))))
     `(ctrlf-highlight-line ((,class :inherit modus-themes-hl-line)))
-    `(ctrlf-highlight-passive ((,class :inherit modus-themes-refine-cyan)))
+    `(ctrlf-highlight-passive ((,class :inherit 
modus-themes-search-success-lazy)))
 ;;;;; custom (M-x customize)
     `(custom-button ((,class :box (:line-width 2 :color nil :style 
released-button)
                              :background ,bg-active :foreground ,fg-main)))
@@ -3764,7 +3811,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(debbugs-gnu-archived ((,class :inverse-video t)))
     `(debbugs-gnu-done ((,class :inherit shadow)))
     `(debbugs-gnu-forwarded ((,class :foreground ,fg-special-warm)))
-    `(debbugs-gnu-handled ((,class :foreground ,green)))
+    `(debbugs-gnu-handled ((,class :foreground ,blue)))
     `(debbugs-gnu-new ((,class :foreground ,red)))
     `(debbugs-gnu-pending ((,class :foreground ,cyan)))
     `(debbugs-gnu-stale-1 ((,class :foreground ,yellow-nuanced-fg)))
@@ -3797,16 +3844,18 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(diff-hl-dired-ignored ((,class :inherit dired-ignored)))
     `(diff-hl-dired-insert ((,class :inherit diff-hl-insert)))
     `(diff-hl-dired-unknown ((,class :inherit dired-ignored)))
-    `(diff-hl-insert ((,class :inherit modus-themes-fringe-green)))
-    `(diff-hl-reverted-hunk-highlight ((,class :inherit 
(modus-themes-active-magenta bold))))
+    `(diff-hl-insert ((,class :inherit ,@(modus-themes--diff-deuteran
+                                          'modus-themes-fringe-blue
+                                          'modus-themes-fringe-green))))
+    `(diff-hl-reverted-hunk-highlight ((,class :background ,fg-main 
:foreground ,bg-main)))
 ;;;;; diff-mode
     `(diff-added ((,class :inherit modus-themes-diff-added)))
     `(diff-changed ((,class :inherit modus-themes-diff-changed :extend t)))
-    `(diff-context ((,class ,@(modus-themes--diff-text fg-main fg-unfocused))))
+    `(diff-context ((,class :foreground ,fg-alt)))
     `(diff-error ((,class :inherit modus-themes-intense-red)))
     `(diff-file-header ((,class :inherit (bold diff-header))))
     `(diff-function ((,class :inherit modus-themes-diff-heading)))
-    `(diff-header ((,class ,@(modus-themes--diff-text cyan-faint fg-main))))
+    `(diff-header ((,class :foreground ,fg-main)))
     `(diff-hunk-header ((,class :inherit (bold modus-themes-diff-heading))))
     `(diff-index ((,class :inherit bold :foreground ,blue-alt)))
     `(diff-indicator-added ((,class :inherit (diff-added bold)
@@ -3975,7 +4024,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(doom-modeline-host ((,class :inherit italic)))
     `(doom-modeline-info ((,class :foreground ,green-active)))
     `(doom-modeline-lsp-error ((,class :inherit bold :foreground ,red-active)))
-    `(doom-modeline-lsp-success ((,class :inherit bold :foreground 
,green-active)))
+    `(doom-modeline-lsp-success ((,class :inherit bold :foreground 
,@(modus-themes--success-deuteran
+                                                                      
blue-active
+                                                                      
green-active))))
     `(doom-modeline-lsp-warning ((,class :inherit bold :foreground 
,yellow-active)))
     `(doom-modeline-panel ((,class :inherit modus-themes-active-blue)))
     `(doom-modeline-persp-buffer-not-in-persp ((,class :inherit italic 
:foreground ,yellow-active)))
@@ -4007,13 +4058,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ebdb-phone-default ((,class :foreground ,cyan)))
     `(eieio-custom-slot-tag-face ((,class :foreground ,red-alt)))
 ;;;;; ediff
-    `(ediff-current-diff-A ((,class :inherit modus-themes-diff-removed)))
+    `(ediff-current-diff-A ((,class :inherit modus-themes-diff-focus-removed)))
     `(ediff-current-diff-Ancestor ((,class ,@(modus-themes--diff
                                               bg-alt fg-special-cold
                                               bg-special-cold fg-special-cold
                                               blue-nuanced-bg blue))))
-    `(ediff-current-diff-B ((,class :inherit modus-themes-diff-added)))
-    `(ediff-current-diff-C ((,class :inherit modus-themes-diff-changed)))
+    `(ediff-current-diff-B ((,class :inherit modus-themes-diff-focus-added)))
+    `(ediff-current-diff-C ((,class :inherit modus-themes-diff-focus-changed)))
     `(ediff-even-diff-A ((,class :background ,bg-alt)))
     `(ediff-even-diff-Ancestor ((,class :background ,bg-alt)))
     `(ediff-even-diff-B ((,class :background ,bg-alt)))
@@ -4030,7 +4081,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(eglot-mode-line ((,class :inherit modus-themes-bold :foreground 
,magenta-active)))
 ;;;;; el-search
     `(el-search-highlight-in-prompt-face ((,class :inherit bold :foreground 
,magenta-alt)))
-    `(el-search-match ((,class :inherit modus-themes-intense-green)))
+    `(el-search-match ((,class :inherit modus-themes-search-success)))
     `(el-search-other-match ((,class :inherit modus-themes-special-mild)))
     `(el-search-occur-match ((,class :inherit modus-themes-special-calm)))
 ;;;;; eldoc
@@ -4083,7 +4134,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(epa-validity-medium ((,class :foreground ,green-alt)))
 ;;;;; equake
     `(equake-buffer-face ((,class :background ,bg-main :foreground ,fg-main)))
-    `(equake-shell-type-eshell ((,class :background ,bg-inactive :foreground 
,green-active)))
+    `(equake-shell-type-eshell ((,class :background ,bg-inactive :foreground 
,blue-active)))
     `(equake-shell-type-rash ((,class :background ,bg-inactive :foreground 
,red-active)))
     `(equake-shell-type-shell ((,class :background ,bg-inactive :foreground 
,cyan-active)))
     `(equake-shell-type-term ((,class :background ,bg-inactive :foreground 
,yellow-active)))
@@ -4153,67 +4204,56 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ert-test-result-expected ((,class :inherit modus-themes-intense-green)))
     `(ert-test-result-unexpected ((,class :inherit modus-themes-intense-red)))
 ;;;;; eshell
-    `(eshell-ls-archive ((,class :inherit bold :foreground ,cyan-alt)))
-    `(eshell-ls-backup ((,class :foreground ,yellow-alt)))
+    `(eshell-ls-archive ((,class :foreground ,cyan-alt)))
+    `(eshell-ls-backup ((,class :inherit shadow)))
     `(eshell-ls-clutter ((,class :foreground ,red-alt)))
-    `(eshell-ls-directory ((,class :inherit bold :foreground ,blue-alt)))
+    `(eshell-ls-directory ((,class :foreground ,blue-alt)))
     `(eshell-ls-executable ((,class :foreground ,magenta-alt)))
     `(eshell-ls-missing ((,class :inherit modus-themes-intense-red)))
-    `(eshell-ls-product ((,class :foreground ,fg-special-warm)))
-    `(eshell-ls-readonly ((,class :foreground ,fg-special-cold)))
-    `(eshell-ls-special ((,class :inherit bold :foreground ,magenta)))
-    `(eshell-ls-symlink ((,class :inherit button
-                                 ,@(modus-themes--link-color
-                                    cyan cyan-faint))))
+    `(eshell-ls-product ((,class :inherit shadow)))
+    `(eshell-ls-readonly ((,class :foreground ,yellow-faint)))
+    `(eshell-ls-special ((,class :foreground ,magenta)))
+    `(eshell-ls-symlink ((,class :foreground ,cyan)))
     `(eshell-ls-unreadable ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
-    `(eshell-prompt ((,class :inherit modus-themes-bold
-                             ,@(modus-themes--prompt
-                                green-alt-other
-                                green-nuanced-bg green-alt
-                                green-refine-bg fg-main))))
+    `(eshell-prompt ((,class :inherit comint-highlight-prompt)))
 ;;;;; eshell-fringe-status
-    `(eshell-fringe-status-failure ((,class :foreground ,red)))
-    `(eshell-fringe-status-success ((,class :foreground ,green)))
+    `(eshell-fringe-status-failure ((,class :inherit error)))
+    `(eshell-fringe-status-success ((,class :inherit success)))
 ;;;;; eshell-git-prompt
-    `(eshell-git-prompt-add-face ((,class :inherit shadow)))
-    `(eshell-git-prompt-branch-face ((,class :inherit shadow)))
-    `(eshell-git-prompt-directory-face ((,class :foreground ,cyan)))
-    `(eshell-git-prompt-exit-fail-face ((,class :foreground ,red)))
-    `(eshell-git-prompt-exit-success-face ((,class :foreground ,green)))
+    `(eshell-git-prompt-add-face ((,class :foreground ,magenta-alt-other)))
+    `(eshell-git-prompt-branch-face ((,class :foreground ,magenta-alt)))
+    `(eshell-git-prompt-directory-face ((,class :inherit bold :foreground 
,blue)))
+    `(eshell-git-prompt-exit-fail-face ((,class :inherit error)))
+    `(eshell-git-prompt-exit-success-face ((,class :inherit success)))
     `(eshell-git-prompt-modified-face ((,class :foreground ,yellow)))
     `(eshell-git-prompt-powerline-clean-face ((,class :background 
,green-refine-bg)))
     `(eshell-git-prompt-powerline-dir-face ((,class :background 
,blue-refine-bg)))
-    `(eshell-git-prompt-powerline-not-clean-face ((,class :background 
,magenta-refine-bg)))
-    `(eshell-git-prompt-robyrussell-branch-face ((,class :foreground ,red)))
+    `(eshell-git-prompt-powerline-not-clean-face ((,class :background 
,yellow-fringe-bg)))
+    `(eshell-git-prompt-robyrussell-branch-face ((,class :foreground 
,magenta-alt)))
     `(eshell-git-prompt-robyrussell-git-dirty-face ((,class :foreground 
,yellow)))
-    `(eshell-git-prompt-robyrussell-git-face ((,class :foreground ,blue)))
+    `(eshell-git-prompt-robyrussell-git-face ((,class :foreground 
,magenta-alt-other)))
 ;;;;; eshell-prompt-extras (epe)
-    `(epe-dir-face ((,class :inherit modus-themes-bold :foreground ,blue)))
+    `(epe-dir-face ((,class :inherit bold :foreground ,blue)))
     `(epe-git-dir-face ((,class :foreground ,red-alt-other)))
-    `(epe-git-face ((,class :foreground ,cyan-alt)))
-    `(epe-pipeline-delimiter-face ((,class :foreground ,green-alt)))
-    `(epe-pipeline-host-face ((,class :foreground ,blue)))
-    `(epe-pipeline-time-face ((,class :foreground ,fg-special-warm)))
-    `(epe-pipeline-user-face ((,class :foreground ,magenta)))
-    `(epe-remote-face ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
+    `(epe-git-face ((,class :foreground ,magenta-alt)))
+    `(epe-pipeline-delimiter-face ((,class :inherit shadow)))
+    `(epe-pipeline-host-face ((,class :foreground ,fg-main)))
+    `(epe-pipeline-time-face ((,class :foreground ,fg-main)))
+    `(epe-pipeline-user-face ((,class :foreground ,magenta-alt-other)))
+    `(epe-remote-face ((,class :inherit (shadow modus-themes-slant))))
     `(epe-status-face ((,class :foreground ,magenta-alt-other)))
-    `(epe-venv-face ((,class :inherit modus-themes-slant :foreground ,fg-alt)))
+    `(epe-venv-face ((,class :inherit (shadow modus-themes-slant))))
 ;;;;; eshell-syntax-highlighting
-    `(eshell-syntax-highlighting-alias-face ((,class :foreground ,cyan)))
-    `(eshell-syntax-highlighting-comment-face ((,class :inherit shadow)))
-    `(eshell-syntax-highlighting-directory-face ((,class :foreground ,blue)))
-    `(eshell-syntax-highlighting-envvar-face ((,class :foreground 
,magenta-alt)))
+    `(eshell-syntax-highlighting-directory-face ((,class :inherit 
eshell-ls-directory)))
     `(eshell-syntax-highlighting-invalid-face ((,class :foreground ,red)))
-    `(eshell-syntax-highlighting-lisp-function-face ((,class :foreground 
,magenta)))
-    `(eshell-syntax-highlighting-shell-command-face ((,class :foreground 
,cyan-alt-other)))
-    `(eshell-syntax-highlighting-string-face ((,class :foreground ,blue-alt)))
+    `(eshell-syntax-highlighting-shell-command-face ((,class :foreground 
,fg-main)))
 ;;;;; evil-mode
     `(evil-ex-commands ((,class :foreground ,magenta-alt-other)))
     `(evil-ex-info ((,class :foreground ,cyan-alt-other)))
-    `(evil-ex-lazy-highlight ((,class :inherit modus-themes-refine-cyan)))
-    `(evil-ex-search ((,class :inherit modus-themes-intense-green)))
+    `(evil-ex-lazy-highlight ((,class :inherit 
modus-themes-search-success-lazy)))
+    `(evil-ex-search ((,class :inherit modus-themes-search-success)))
     `(evil-ex-substitute-matches ((,class :inherit modus-themes-refine-yellow 
:underline t)))
-    `(evil-ex-substitute-replacement ((,class :inherit 
(modus-themes-intense-green bold))))
+    `(evil-ex-substitute-replacement ((,class :inherit 
(modus-themes-search-success bold))))
 ;;;;; evil-goggles
     `(evil-goggles-change-face ((,class :inherit modus-themes-refine-yellow)))
     `(evil-goggles-commentary-face ((,class :inherit 
(modus-themes-subtle-neutral modus-themes-slant))))
@@ -4279,7 +4319,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(flycheck-indicator-error ((,class :inherit modus-themes-bold :foreground 
,red-active)))
     `(flycheck-indicator-info ((,class :inherit modus-themes-bold :foreground 
,blue-active)))
     `(flycheck-indicator-running ((,class :inherit modus-themes-bold 
:foreground ,magenta-active)))
-    `(flycheck-indicator-success ((,class :inherit modus-themes-bold 
:foreground ,green-active)))
+    `(flycheck-indicator-success ((,class :inherit modus-themes-bold
+                                          :foreground 
,@(modus-themes--success-deuteran
+                                                         blue-active
+                                                         green-active))))
     `(flycheck-indicator-warning ((,class :inherit modus-themes-bold 
:foreground ,yellow-active)))
 ;;;;; flycheck-posframe
     `(flycheck-posframe-background-face ((,class :background ,bg-alt)))
@@ -4417,17 +4460,23 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(git-commit-pseudo-header ((,class :foreground ,blue)))
     `(git-commit-summary ((,class :inherit bold :foreground ,cyan)))
 ;;;;; git-gutter
-    `(git-gutter:added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter:added ((,class :inherit ,@(modus-themes--diff-deuteran
+                                            'modus-themes-fringe-blue
+                                            'modus-themes-fringe-green))))
     `(git-gutter:deleted ((,class :inherit modus-themes-fringe-red)))
     `(git-gutter:modified ((,class :inherit modus-themes-fringe-yellow)))
     `(git-gutter:separator ((,class :inherit modus-themes-fringe-cyan)))
     `(git-gutter:unchanged ((,class :inherit modus-themes-fringe-magenta)))
 ;;;;; git-gutter-fr
-    `(git-gutter-fr:added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter-fr:added ((,class :inherit ,@(modus-themes--diff-deuteran
+                                               'modus-themes-fringe-blue
+                                               'modus-themes-fringe-green))))
     `(git-gutter-fr:deleted ((,class :inherit modus-themes-fringe-red)))
     `(git-gutter-fr:modified ((,class :inherit modus-themes-fringe-yellow)))
 ;;;;; git-{gutter,fringe}+
-    `(git-gutter+-added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter+-added ((,class :inherit ,@(modus-themes--diff-deuteran
+                                          'modus-themes-fringe-blue
+                                          'modus-themes-fringe-green))))
     `(git-gutter+-deleted ((,class :inherit modus-themes-fringe-red)))
     `(git-gutter+-modified ((,class :inherit modus-themes-fringe-yellow)))
     `(git-gutter+-separator ((,class :inherit modus-themes-fringe-cyan)))
@@ -4436,7 +4485,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(git-gutter-fr+-deleted ((,class :inherit modus-themes-fringe-red)))
     `(git-gutter-fr+-modified ((,class :inherit modus-themes-fringe-yellow)))
 ;;;;; git-lens
-    `(git-lens-added ((,class :inherit bold :foreground ,green)))
+    `(git-lens-added ((,class :inherit bold :foreground 
,@(modus-themes--diff-deuteran blue green))))
     `(git-lens-deleted ((,class :inherit bold :foreground ,red)))
     `(git-lens-header ((,class :inherit bold :height 1.1 :foreground ,cyan)))
     `(git-lens-modified ((,class :inherit bold :foreground ,yellow)))
@@ -4460,17 +4509,17 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(git-walktree-tree-face ((,class :foreground ,magenta)))
 ;;;;; gnus
     `(gnus-button ((,class :inherit button)))
-    `(gnus-cite-1 ((,class :foreground ,blue-faint)))
-    `(gnus-cite-10 ((,class :foreground ,yellow-alt-other)))
-    `(gnus-cite-11 ((,class :foreground ,magenta-alt)))
-    `(gnus-cite-2 ((,class :foreground ,green-alt-other)))
-    `(gnus-cite-3 ((,class :foreground ,red-alt-other)))
-    `(gnus-cite-4 ((,class :foreground ,cyan)))
-    `(gnus-cite-5 ((,class :foreground ,yellow-alt)))
-    `(gnus-cite-6 ((,class :foreground ,magenta)))
-    `(gnus-cite-7 ((,class :foreground ,green-alt)))
-    `(gnus-cite-8 ((,class :foreground ,magenta-alt-other)))
-    `(gnus-cite-9 ((,class :foreground ,cyan-alt)))
+    `(gnus-cite-1 ((,class :inherit message-cited-text-1)))
+    `(gnus-cite-2 ((,class :inherit message-cited-text-2)))
+    `(gnus-cite-3 ((,class :inherit message-cited-text-3)))
+    `(gnus-cite-4 ((,class :inherit message-cited-text-4)))
+    `(gnus-cite-5 ((,class :inherit gnus-cite-1)))
+    `(gnus-cite-6 ((,class :inherit gnus-cite-2)))
+    `(gnus-cite-7 ((,class :inherit gnus-cite-3)))
+    `(gnus-cite-8 ((,class :inherit gnus-cite-4)))
+    `(gnus-cite-9 ((,class :inherit gnus-cite-1)))
+    `(gnus-cite-10 ((,class :inherit gnus-cite-2)))
+    `(gnus-cite-11 ((,class :inherit gnus-cite-3)))
     `(gnus-cite-attribution ((,class :inherit italic :foreground ,fg-main)))
     `(gnus-emphasis-bold ((,class :inherit bold)))
     `(gnus-emphasis-bold-italic ((,class :inherit bold-italic)))
@@ -4497,8 +4546,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(gnus-group-news-4-empty ((,class :foreground ,cyan-nuanced-fg)))
     `(gnus-group-news-5 ((,class :inherit bold :foreground ,red-nuanced-fg)))
     `(gnus-group-news-5-empty ((,class :foreground ,red-nuanced-fg)))
-    `(gnus-group-news-6 ((,class :inherit bold :foreground ,fg-alt)))
-    `(gnus-group-news-6-empty ((,class :inherit shadow)))
+    `(gnus-group-news-6 ((,class :inherit bold :foreground ,fg-unfocused)))
+    `(gnus-group-news-6-empty ((,class :foreground ,fg-unfocused)))
     `(gnus-group-news-low ((,class :inherit bold :foreground 
,green-nuanced-fg)))
     `(gnus-group-news-low-empty ((,class :foreground ,green-nuanced-fg)))
     `(gnus-header-content ((,class :inherit message-header-other)))
@@ -4722,8 +4771,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(highlight-defined-special-form-name-face ((,class :foreground 
,magenta-alt-other)))
     `(highlight-defined-variable-name-face ((,class :foreground ,cyan)))
 ;;;;; highlight-escape-sequences (`hes-mode')
-    `(hes-escape-backslash-face ((,class :inherit bold :foreground 
,fg-escape-char-construct)))
-    `(hes-escape-sequence-face ((,class :inherit bold :foreground 
,fg-escape-char-backslash)))
+    `(hes-escape-backslash-face ((,class :inherit 
font-lock-regexp-grouping-construct)))
+    `(hes-escape-sequence-face ((,class :inherit 
font-lock-regexp-grouping-backslash)))
 ;;;;; highlight-indentation
     `(highlight-indentation-face ((,class :inherit modus-themes-hl-line)))
     `(highlight-indentation-current-column-face ((,class :background 
,bg-active)))
@@ -4843,18 +4892,20 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ioccur-title-face ((,class :inherit bold :foreground ,red-alt
                                  ,@(modus-themes--scale 
modus-themes-scale-4))))
 ;;;;; isearch, occur, and the like
-    `(isearch ((,class :inherit (modus-themes-intense-green bold))))
+    `(isearch ((,class :inherit (modus-themes-search-success bold))))
     `(isearch-fail ((,class :inherit modus-themes-refine-red)))
-    `(isearch-group-1 ((,class :inherit modus-themes-intense-blue)))
-    `(isearch-group-2 ((,class :inherit modus-themes-intense-magenta)))
-    `(lazy-highlight ((,class :inherit modus-themes-refine-cyan)))
+    `(isearch-group-1 ((,class :inherit modus-themes-refine-blue)))
+    `(isearch-group-2 ((,class :inherit modus-themes-refine-magenta)))
+    `(lazy-highlight ((,class :inherit modus-themes-search-success-lazy)))
     `(match ((,class :inherit modus-themes-special-calm)))
     `(query-replace ((,class :inherit (modus-themes-intense-yellow bold))))
 ;;;;; isl (isearch-light)
-    `(isl-line ((,class :inherit modus-themes-subtle-green)))
-    `(isl-match ((,class :inherit modus-themes-refine-cyan)))
-    `(isl-number ((,class :inherit modus-themes-bold :foreground 
,green-active)))
-    `(isl-on ((,class :inherit (bold modus-themes-intense-green))))
+    `(isl-line ((,class :inherit ,@(modus-themes--success-deuteran
+                                    'modus-themes-subtle-blue
+                                    'modus-themes-subtle-green))))
+    `(isl-match ((,class :inherit modus-themes-search-success-lazy)))
+    `(isl-number ((,class :inherit (modus-themes-bold 
modus-themes-search-success-modeline))))
+    `(isl-on ((,class :inherit (bold modus-themes-search-success))))
     `(isl-string ((,class :inherit modus-themes-bold :foreground 
,cyan-active)))
 ;;;;; ivy
     `(ivy-action ((,class :inherit bold :foreground ,red-alt)))
@@ -4959,9 +5010,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(jupyter-repl-output-prompt ((,class :foreground ,magenta-alt-other)))
     `(jupyter-repl-traceback ((,class :inherit modus-themes-intense-red)))
 ;;;;; kaocha-runner
-    `(kaocha-runner-error-face ((,class :foreground ,red)))
-    `(kaocha-runner-success-face ((,class :foreground ,green)))
-    `(kaocha-runner-warning-face ((,class :foreground ,yellow)))
+    `(kaocha-runner-error-face ((,class :inherit error)))
+    `(kaocha-runner-success-face ((,class :inherit success)))
+    `(kaocha-runner-warning-face ((,class :inherit warning)))
 ;;;;; keycast
     `(keycast-command ((,class :inherit bold :foreground ,blue-active)))
     `(keycast-key ((,class :background ,blue-active :foreground ,bg-main)))
@@ -5058,7 +5109,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     ;; not the highlighted ones.  This is because Magit's interaction
     ;; model relies on highlighting the current diff hunk.
     `(magit-diff-added ((,class ,@(modus-themes--diff
-                                   bg-main green
+                                   bg-main blue-alt-other
                                    bg-diff-added fg-diff-added
                                    green-nuanced-bg fg-diff-added
                                    bg-diff-added-deuteran 
fg-diff-added-deuteran))))
@@ -5072,17 +5123,23 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-diff-context-highlight ((,class ,@(modus-themes--diff
                                                bg-dim fg-dim
                                                bg-inactive fg-inactive
+                                               bg-dim fg-alt
                                                bg-dim fg-alt))))
     `(magit-diff-file-heading ((,class :inherit bold :foreground 
,fg-special-cold)))
     `(magit-diff-file-heading-highlight ((,class :inherit 
(modus-themes-special-cold bold))))
     `(magit-diff-file-heading-selection ((,class :inherit 
modus-themes-refine-cyan)))
     ;; NOTE: here we break from the pattern of inheriting from the
     ;; modus-themes-diff-* faces.
-    `(magit-diff-hunk-heading ((,class :inherit bold :background ,bg-active
-                                       :foreground ,fg-inactive)))
+    `(magit-diff-hunk-heading ((,class :inherit bold
+                                       ,@(modus-themes--diff
+                                          bg-alt fg-alt
+                                          bg-active fg-inactive
+                                          bg-inactive fg-inactive
+                                          bg-inactive fg-inactive
+                                          t))))
     `(magit-diff-hunk-heading-highlight
       ((,class :inherit bold
-               :background ,@(modus-themes--diff-deuteran bg-region 
bg-diff-heading)
+               :background ,@(modus-themes--diff-deuteran bg-active 
bg-diff-heading)
                :foreground ,@(modus-themes--diff-deuteran fg-main 
fg-diff-heading))))
     `(magit-diff-hunk-heading-selection ((,class :inherit 
modus-themes-refine-blue)))
     `(magit-diff-hunk-region ((,class :inherit bold)))
@@ -5128,7 +5185,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-section-heading ((,class :inherit bold :foreground ,cyan)))
     `(magit-section-heading-selection ((,class :inherit 
(modus-themes-refine-cyan bold))))
     `(magit-section-highlight ((,class :background ,bg-alt)))
-    `(magit-sequence-done ((,class :foreground ,green-alt)))
+    `(magit-sequence-done ((,class :foreground 
,@(modus-themes--success-deuteran
+                                                  blue
+                                                  green))))
     `(magit-sequence-drop ((,class :foreground ,red-alt)))
     `(magit-sequence-exec ((,class :foreground ,magenta-alt)))
     `(magit-sequence-head ((,class :foreground ,cyan-alt)))
@@ -5140,7 +5199,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-signature-error ((,class :foreground ,red-alt)))
     `(magit-signature-expired ((,class :foreground ,yellow)))
     `(magit-signature-expired-key ((,class :foreground ,yellow)))
-    `(magit-signature-good ((,class :foreground ,green)))
+    `(magit-signature-good ((,class :foreground 
,@(modus-themes--success-deuteran
+                                                   blue
+                                                   green))))
     `(magit-signature-revoked ((,class :foreground ,magenta)))
     `(magit-signature-untrusted ((,class :foreground ,cyan)))
     `(magit-tag ((,class :foreground ,yellow-alt-other)))
@@ -5275,10 +5336,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mentor-highlight-face ((,class :inherit modus-themes-subtle-blue)))
     `(mentor-tracker-name ((,class :foreground ,magenta-alt)))
 ;;;;; messages
-    `(message-cited-text-1 ((,class :foreground ,blue-faint)))
-    `(message-cited-text-2 ((,class :foreground ,green-alt-other)))
-    `(message-cited-text-3 ((,class :foreground ,red-alt-other)))
-    `(message-cited-text-4 ((,class :foreground ,cyan)))
+    `(message-cited-text-1 ((,class ,@(modus-themes--mail-cite blue-faint 
fg-alt))))
+    `(message-cited-text-2 ((,class ,@(modus-themes--mail-cite green-faint 
fg-comment-yellow))))
+    `(message-cited-text-3 ((,class ,@(modus-themes--mail-cite red-faint 
fg-special-cold))))
+    `(message-cited-text-4 ((,class ,@(modus-themes--mail-cite yellow-faint 
fg-special-calm))))
     `(message-header-cc ((,class :foreground ,blue-alt-other)))
     `(message-header-name ((,class :inherit bold :foreground ,cyan)))
     `(message-header-newsgroups ((,class :inherit message-header-other)))
@@ -5286,7 +5347,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(message-header-subject ((,class :inherit bold :foreground ,magenta-alt)))
     `(message-header-to ((,class :inherit bold :foreground 
,magenta-alt-other)))
     `(message-header-xheader ((,class :foreground ,blue-alt)))
-    `(message-mml ((,class :foreground ,yellow)))
+    `(message-mml ((,class :foreground ,cyan-alt-other)))
     `(message-separator ((,class :inherit modus-themes-intense-neutral)))
 ;;;;; minibuffer-line
     `(minibuffer-line ((,class :foreground ,fg-main)))
@@ -5302,7 +5363,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mmm-init-submode-face ((,class :background ,magenta-nuanced-bg)))
     `(mmm-output-submode-face ((,class :background ,red-nuanced-bg)))
     `(mmm-special-submode-face ((,class :background ,green-nuanced-bg)))
-;;;;; modeline
+;;;;; mode-line
     `(mode-line ((,class ,@(modus-themes--variable-pitch-ui)
                          ,@(modus-themes--mode-line-attrs
                             fg-active bg-active
@@ -5324,7 +5385,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mood-line-status-error ((,class :inherit bold :foreground ,red-active)))
     `(mood-line-status-info ((,class :foreground ,cyan-active)))
     `(mood-line-status-neutral ((,class :foreground ,blue-active)))
-    `(mood-line-status-success ((,class :foreground ,green-active)))
+    `(mood-line-status-success ((,class :foreground 
,@(modus-themes--success-deuteran
+                                                       blue-active
+                                                       green-active))))
     `(mood-line-status-warning ((,class :inherit bold :foreground 
,yellow-active)))
     `(mood-line-unimportant ((,class :foreground ,fg-inactive)))
 ;;;;; mpdel
@@ -5332,13 +5395,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mpdel-playlist-current-song-face ((,class :inherit bold :foreground 
,blue-alt-other)))
 ;;;;; mu4e
     `(mu4e-attach-number-face ((,class :inherit bold :foreground ,fg-dim)))
-    `(mu4e-cited-1-face ((,class :foreground ,blue-faint)))
-    `(mu4e-cited-2-face ((,class :foreground ,green-alt-other)))
-    `(mu4e-cited-3-face ((,class :foreground ,red-alt-other)))
-    `(mu4e-cited-4-face ((,class :foreground ,cyan)))
-    `(mu4e-cited-5-face ((,class :foreground ,yellow-alt)))
-    `(mu4e-cited-6-face ((,class :foreground ,magenta)))
-    `(mu4e-cited-7-face ((,class :foreground ,green-alt)))
+    `(mu4e-cited-1-face ((,class :inherit message-cited-text-1)))
+    `(mu4e-cited-2-face ((,class :inherit message-cited-text-2)))
+    `(mu4e-cited-3-face ((,class :inherit message-cited-text-3)))
+    `(mu4e-cited-4-face ((,class :inherit message-cited-text-4)))
+    `(mu4e-cited-5-face ((,class :inherit message-cited-text-1)))
+    `(mu4e-cited-6-face ((,class :inherit message-cited-text-2)))
+    `(mu4e-cited-7-face ((,class :inherit message-cited-text-3)))
     `(mu4e-compose-header-face ((,class :inherit mu4e-compose-separator-face)))
     `(mu4e-compose-separator-face ((,class :inherit 
modus-themes-intense-neutral)))
     `(mu4e-contact-face ((,class :inherit message-header-to)))
@@ -5392,7 +5455,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(neo-file-link-face ((,class :foreground ,fg-main)))
     `(neo-header-face ((,class :inherit bold :foreground ,fg-main)))
     `(neo-root-dir-face ((,class :inherit bold :foreground ,cyan-alt)))
-    `(neo-vc-added-face ((,class :foreground ,green)))
+    `(neo-vc-added-face ((,class :foreground ,@(modus-themes--diff-deuteran 
blue green))))
     `(neo-vc-conflict-face ((,class :inherit bold :foreground ,red)))
     `(neo-vc-default-face ((,class :foreground ,fg-main)))
     `(neo-vc-edited-face ((,class :foreground ,yellow)))
@@ -5407,33 +5470,33 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; no-emoji
     `(no-emoji ((,class :foreground ,cyan)))
 ;;;;; notmuch
-    `(notmuch-crypto-decryption ((,class :inherit modus-themes-special-mild)))
+    `(notmuch-crypto-decryption ((,class :inherit (shadow bold))))
     `(notmuch-crypto-part-header ((,class :foreground ,magenta-alt-other)))
-    `(notmuch-crypto-signature-bad ((,class :inherit 
modus-themes-intense-red)))
-    `(notmuch-crypto-signature-good ((,class :inherit 
modus-themes-refine-blue)))
-    `(notmuch-crypto-signature-good-key ((,class :inherit 
modus-themes-refine-cyan)))
-    `(notmuch-crypto-signature-unknown ((,class :inherit 
modus-themes-refine-red)))
+    `(notmuch-crypto-signature-bad ((,class :inherit error)))
+    `(notmuch-crypto-signature-good ((,class :inherit success)))
+    `(notmuch-crypto-signature-good-key ((,class :inherit bold :foreground 
,cyan)))
+    `(notmuch-crypto-signature-unknown ((,class :inherit warning)))
     `(notmuch-hello-logo-background ((,class :background "gray50")))
-    `(notmuch-message-summary-face ((,class :inherit 
modus-themes-nuanced-cyan)))
+    `(notmuch-message-summary-face ((,class :inherit (bold 
modus-themes-nuanced-cyan))))
     `(notmuch-search-count ((,class :inherit shadow)))
     `(notmuch-search-date ((,class :foreground ,cyan)))
     `(notmuch-search-flagged-face ((,class :foreground ,red-alt)))
-    `(notmuch-search-matching-authors ((,class :foreground ,fg-main)))
+    `(notmuch-search-matching-authors ((,class :foreground ,fg-special-cold)))
     `(notmuch-search-non-matching-authors ((,class :inherit shadow)))
-    `(notmuch-search-subject ((,class :foreground ,fg-dim)))
+    `(notmuch-search-subject ((,class :foreground ,fg-main)))
     `(notmuch-search-unread-face ((,class :inherit bold)))
-    `(notmuch-tag-added ((,class :inherit modus-themes-lang-note)))
-    `(notmuch-tag-deleted ((,class :inherit modus-themes-lang-error)))
-    `(notmuch-tag-face ((,class :inherit bold :foreground ,blue-alt)))
+    `(notmuch-tag-added ((,class :underline ,blue)))
+    `(notmuch-tag-deleted ((,class :strike-through ,red)))
+    `(notmuch-tag-face ((,class :foreground ,blue)))
     `(notmuch-tag-flagged ((,class :foreground ,red-alt)))
     `(notmuch-tag-unread ((,class :foreground ,magenta-alt)))
-    `(notmuch-tree-match-author-face ((,class :foreground ,fg-special-cold)))
+    `(notmuch-tree-match-author-face ((,class :inherit 
notmuch-search-matching-authors)))
     `(notmuch-tree-match-date-face ((,class :inherit notmuch-search-date)))
     `(notmuch-tree-match-face ((,class :foreground ,fg-main)))
-    `(notmuch-tree-match-tag-face ((,class :inherit bold :foreground 
,blue-alt)))
+    `(notmuch-tree-match-tag-face ((,class :inherit notmuch-tag-face)))
     `(notmuch-tree-no-match-face ((,class :inherit shadow)))
     `(notmuch-tree-no-match-date-face ((,class :inherit shadow)))
-    `(notmuch-wash-cited-text ((,class :foreground ,cyan)))
+    `(notmuch-wash-cited-text ((,class :inherit message-cited-text-1)))
     `(notmuch-wash-toggle-button ((,class :background ,bg-alt :foreground 
,fg-alt)))
 ;;;;; num3-mode
     `(num3-face-even ((,class :inherit bold :background ,bg-alt)))
@@ -5505,8 +5568,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                     :foreground ,blue-alt)))
     `(org-archived ((,class :background ,bg-alt :foreground ,fg-alt)))
     `(org-block ((,class ,@(modus-themes--mixed-fonts)
-                         ,@(modus-themes--org-block bg-dim)
-                         :foreground ,fg-main)))
+                         ,@(modus-themes--org-block bg-dim fg-main))))
     `(org-block-begin-line ((,class ,@(modus-themes--mixed-fonts)
                                     ,@(modus-themes--org-block-delim
                                        bg-dim fg-special-cold
@@ -5533,7 +5595,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                          :foreground ,fg-alt)))
     `(org-document-title ((,class :inherit (bold modus-themes-variable-pitch) 
:foreground ,fg-special-cold
                                   ,@(modus-themes--scale 
modus-themes-scale-5))))
-    `(org-done ((,class :foreground ,green)))
+    `(org-done ((,class :foreground ,@(modus-themes--success-deuteran blue 
green))))
     `(org-drawer ((,class ,@(modus-themes--mixed-fonts)
                           :foreground ,fg-alt)))
     `(org-ellipsis (())) ; inherits from the heading's color
@@ -5574,7 +5636,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                               green-graph-1-bg
                                               green-graph-0-bg
                                               green-graph-1-bg))))
-    `(org-headline-done ((,class :inherit modus-themes-variable-pitch 
:foreground ,green-nuanced-fg)))
+    `(org-headline-done ((,class :inherit modus-themes-variable-pitch
+                                 :foreground ,@(modus-themes--success-deuteran
+                                                blue-nuanced-fg
+                                                green-nuanced-fg))))
     `(org-headline-todo ((,class :inherit modus-themes-variable-pitch 
:foreground ,red-nuanced-fg)))
     `(org-hide ((,class :foreground ,bg-main)))
     `(org-indent ((,class :inherit (fixed-pitch org-hide))))
@@ -5597,7 +5662,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(org-priority ((,class :foreground ,magenta)))
     `(org-property-value ((,class ,@(modus-themes--mixed-fonts)
                                   :foreground ,fg-special-cold)))
-    `(org-quote ((,class ,@(modus-themes--org-block bg-dim))))
+    `(org-quote ((,class ,@(modus-themes--org-block bg-dim fg-special-cold 
fg-main))))
     `(org-scheduled ((,class :foreground ,magenta-alt)))
     `(org-scheduled-previously ((,class :foreground ,yellow-alt-other)))
     `(org-scheduled-today ((,class :foreground ,magenta-alt-other)))
@@ -5736,15 +5801,17 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; phi-search
     `(phi-replace-preview-face ((,class :inherit 
modus-themes-intense-magenta)))
     `(phi-search-failpart-face ((,class :inherit modus-themes-refine-red)))
-    `(phi-search-match-face ((,class :inherit modus-themes-refine-cyan)))
-    `(phi-search-selection-face ((,class :inherit (modus-themes-intense-green 
bold))))
+    `(phi-search-match-face ((,class :inherit 
modus-themes-search-success-lazy)))
+    `(phi-search-selection-face ((,class :inherit (modus-themes-search-success 
bold))))
 ;;;;; pkgbuild-mode
     `(pkgbuild-error-face ((,class :inherit modus-themes-lang-error)))
 ;;;;; pomidor
     `(pomidor-break-face ((,class :foreground ,blue-alt-other)))
     `(pomidor-overwork-face ((,class :foreground ,red-alt-other)))
     `(pomidor-skip-face ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
-    `(pomidor-work-face ((,class :foreground ,green-alt-other)))
+    `(pomidor-work-face ((,class :foreground ,@(modus-themes--success-deuteran
+                                                blue-alt
+                                                green-alt-other))))
 ;;;;; popup
     `(popup-face ((,class :background ,bg-alt :foreground ,fg-main)))
     `(popup-isearch-match ((,class :inherit (modus-themes-refine-cyan bold))))
@@ -5943,7 +6010,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(selectrum-quick-keys-highlight
       ((,class :inherit modus-themes-refine-red)))
     `(selectrum-quick-keys-match
-      ((,class :inherit (bold modus-themes-intense-green))))
+      ((,class :inherit (bold modus-themes-search-success))))
 ;;;;; selectrum-prescient
     `(selectrum-prescient-primary-highlight
       ((,class :inherit bold
@@ -5983,7 +6050,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(show-paren-match ((,class ,@(modus-themes--paren bg-paren-match
                                                        bg-paren-match-intense)
                                 :foreground ,fg-main)))
-    `(show-paren-match-expression ((,class :inherit 
modus-themes-special-calm)))
+    `(show-paren-match-expression ((,class :background ,bg-paren-expression)))
     `(show-paren-mismatch ((,class :inherit modus-themes-intense-red)))
 ;;;;; shr
     `(shr-abbreviation ((,class :inherit modus-themes-lang-note)))
@@ -6149,22 +6216,14 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(syslog-su ((,class :inherit bold :foreground ,red-alt)))
     `(syslog-warn ((,class :inherit bold :foreground ,yellow)))
 ;;;;; tab-bar-groups
-    `(tab-bar-groups-1 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,blue-tab)))
-    `(tab-bar-groups-1-group-name ((,class :inherit tab-bar-groups-1 
:inverse-video t)))
-    `(tab-bar-groups-2 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,red-tab)))
-    `(tab-bar-groups-2-group-name ((,class :inherit tab-bar-groups-2 
:inverse-video t)))
-    `(tab-bar-groups-3 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,green-tab)))
-    `(tab-bar-groups-3-group-name ((,class :inherit tab-bar-groups-3 
:inverse-video t)))
-    `(tab-bar-groups-4 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,orange-tab)))
-    `(tab-bar-groups-4-group-name ((,class :inherit tab-bar-groups-4 
:inverse-video t)))
-    `(tab-bar-groups-5 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,purple-tab)))
-    `(tab-bar-groups-5-group-name ((,class :inherit tab-bar-groups-5 
:inverse-video t)))
-    `(tab-bar-groups-6 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,cyan-tab)))
-    `(tab-bar-groups-6-group-name ((,class :inherit tab-bar-groups-6 
:inverse-video t)))
-    `(tab-bar-groups-7 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,yellow-tab)))
-    `(tab-bar-groups-7-group-name ((,class :inherit tab-bar-groups-7 
:inverse-video t)))
-    `(tab-bar-groups-8 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,magenta-tab)))
-    `(tab-bar-groups-8-group-name ((,class :inherit tab-bar-groups-8 
:inverse-video t)))
+    `(tab-bar-groups-tab-1 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,blue-tab)))
+    `(tab-bar-groups-tab-2 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,red-tab)))
+    `(tab-bar-groups-tab-3 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,green-tab)))
+    `(tab-bar-groups-tab-4 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,orange-tab)))
+    `(tab-bar-groups-tab-5 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,purple-tab)))
+    `(tab-bar-groups-tab-6 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,cyan-tab)))
+    `(tab-bar-groups-tab-7 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,yellow-tab)))
+    `(tab-bar-groups-tab-8 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,magenta-tab)))
 ;;;;; tab-bar-mode
     `(tab-bar ((,class ,@(modus-themes--variable-pitch-ui)
                        :background ,bg-tab-bar :foreground ,fg-main)))
@@ -6254,7 +6313,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(transient-argument ((,class :inherit bold :foreground ,red-alt)))
     `(transient-blue ((,class :inherit bold :foreground ,blue)))
     `(transient-disabled-suffix ((,class :inherit modus-themes-intense-red)))
-    `(transient-enabled-suffix ((,class :inherit modus-themes-intense-green)))
+    `(transient-enabled-suffix ((,class :inherit 
,@(modus-themes--success-deuteran
+                                                    'modus-themes-subtle-blue
+                                                    
'modus-themes-subtle-green))))
     `(transient-heading ((,class :inherit bold :foreground ,fg-main)))
     `(transient-inactive-argument ((,class :inherit shadow)))
     `(transient-inactive-value ((,class :inherit shadow)))
@@ -6291,7 +6352,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(treemacs-help-column-face ((,class :inherit modus-themes-bold 
:foreground ,magenta-alt-other :underline t)))
     `(treemacs-help-title-face ((,class :foreground ,blue-alt-other)))
     `(treemacs-on-failure-pulse-face ((,class :inherit 
modus-themes-intense-red)))
-    `(treemacs-on-success-pulse-face ((,class :inherit 
modus-themes-intense-green)))
+    `(treemacs-on-success-pulse-face ((,class :inherit 
,@(modus-themes--success-deuteran
+                                                          
'modus-themes-intense-blue
+                                                          
'modus-themes-intense-green))))
     `(treemacs-root-face ((,class :inherit bold :foreground ,blue-alt-other 
:height 1.2 :underline t)))
     `(treemacs-root-remote-disconnected-face ((,class :inherit 
treemacs-root-remote-face :foreground ,yellow)))
     `(treemacs-root-remote-face ((,class :inherit treemacs-root-face 
:foreground ,magenta)))
@@ -6563,9 +6626,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(flymake-note-bitmap '(exclamation-mark modus-themes-fringe-cyan))
 ;;;; ibuffer
     `(ibuffer-deletion-face 'modus-themes-mark-del)
-    `(ibuffer-filter-group-name-face 'modus-themes-mark-symbol)
+    `(ibuffer-filter-group-name-face 'modus-themes-pseudo-header)
     `(ibuffer-marked-face 'modus-themes-mark-sel)
-    `(ibuffer-title-face 'modus-themes-pseudo-header)
+    `(ibuffer-title-face 'default)
 ;;;; highlight-tail
     `(highlight-tail-colors
       '((,green-subtle-bg . 0)
@@ -6619,7 +6682,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;; xterm-color
     `(xterm-color-names ["black" ,red ,green ,yellow ,blue ,magenta ,cyan 
"gray65"])
     `(xterm-color-names-bright ["gray35" ,red-alt ,green-alt ,yellow-alt 
,blue-alt ,magenta-alt ,cyan-alt "white"])
-    (if (eq modus-themes-org-blocks 'rainbow)
+    (if (or (eq modus-themes-org-blocks 'tinted-background)
+            (eq modus-themes-org-blocks 'rainbow))
         `(org-src-block-faces              ; TODO this list should be expanded
           `(("emacs-lisp" modus-themes-nuanced-magenta)
             ("elisp" modus-themes-nuanced-magenta)
diff --git a/etc/themes/modus-vivendi-theme.el 
b/etc/themes/modus-vivendi-theme.el
index ff59d30..fa8ba21 100644
--- a/etc/themes/modus-vivendi-theme.el
+++ b/etc/themes/modus-vivendi-theme.el
@@ -4,7 +4,7 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.3.2
+;; Version: 1.4.0
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
diff --git a/etc/tutorials/TUTORIAL b/etc/tutorials/TUTORIAL
index 6194e55..dcdb61f 100644
--- a/etc/tutorials/TUTORIAL
+++ b/etc/tutorials/TUTORIAL
@@ -1038,10 +1038,10 @@ then type C-x 1.
 
 Here are some other useful C-h options:
 
-   C-h f       Describe a function.  You type in the name of the
-               function.
+   C-h x       Describe a command.  You type in the name of the
+               command.
 
->> Try typing C-h f previous-line <Return>.
+>> Try typing C-h x previous-line <Return>.
    This displays all the information Emacs has about the
    function which implements the C-p command.
 
diff --git a/etc/tutorials/TUTORIAL.es b/etc/tutorials/TUTORIAL.es
index 786a9f4..a92604c 100644
--- a/etc/tutorials/TUTORIAL.es
+++ b/etc/tutorials/TUTORIAL.es
@@ -1091,10 +1091,10 @@ ayuda, y entonces teclear C-x 1.
 
 Aquí hay algunas otras opciones útiles de C-h:
 
-   C-h f       Describe una función.  Usted teclea el nombre de la
-               función.
+   C-h x       Describe un comando.  Usted teclea el nombre del
+               comando.
 
->> Intente teclear C-h f previous-line <Return>.
+>> Intente teclear C-h x previous-line <Return>.
    Esto muestra toda la información que Emacs tiene sobre la función
    que implementa el comando C-p
 
diff --git a/etc/tutorials/TUTORIAL.he b/etc/tutorials/TUTORIAL.he
index 5cd1cac..2ee4f74 100644
--- a/etc/tutorials/TUTORIAL.he
+++ b/etc/tutorials/TUTORIAL.he
@@ -931,9 +931,9 @@ M-x help <Return>‎ כתחליף.)
 
 הנה עוד כמה פקודות עזרה שימושיות:
 
-    ‏C-h f     תן הסבר על פונקציה. יש להקיש את שם הפונקציה.
+    ‏C-h x     תן הסבר על פקודה. יש להקיש את שם הפקודה.
 
->> נסו להקיש C-h f previous-line <Return>‎.
+>> נסו להקיש C-h x previous-line <Return>‎.
    כתוצאה, יוצג תיעוד מלא של הפונקציה המממשת את הפקודה C-p כפי שהוא
    ידוע ל־Emacs.
 
diff --git a/etc/tutorials/TUTORIAL.it b/etc/tutorials/TUTORIAL.it
index ac59379..68bf403 100644
--- a/etc/tutorials/TUTORIAL.it
+++ b/etc/tutorials/TUTORIAL.it
@@ -578,7 +578,7 @@ originale in modo da conservarlo.  Il nuovo nome è ottenuto
 aggiungendo un carattere "~" alla fine del nome originale.  Quando il
 salvataggio termina, Emacs mostra il nome del file scritto.
 
->> Premi C-x C-s TUTORIAL<Invio>.
+>> Premi C-x C-s TUTORIAL <Invio>.
    Questo dovrebbe salvare questa esercitazione in un file chiamato
    “TUTORIAL” e mostrare “Wrote ...TUTORIAL nella parte bassa dello
    schermo.
@@ -623,8 +623,8 @@ file, puoi farlo visitando di nuovo quel file usando C-x 
C-f.  Ma c'è
 un modo più semplice: usa il comando C-x b.  Questo comando richiede
 il nome del buffer.
 
->> Crea un file chiamato “pippo” con C-x C-f pippo<Invio>.
-   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
+>> Crea un file chiamato “pippo” con C-x C-f pippo <Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL <Invio>.
 
 La maggior parte delle volte, il nome del buffer corrisponde al nome
 del file (senza la parte relativa alla directory).  Questo non è
@@ -641,8 +641,8 @@ Anche il buffer chiamato “*Messages* non è associato ad 
alcun file.
 Quel buffer contiene tutti i messaggi che sono apparsi nella parte
 bassa dello schermo durante la sessione di Emacs.
 
->> Passa al buffer con i messaggi con C-x b *Messages*<Invio>.
-   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
+>> Passa al buffer con i messaggi con C-x b *Messages* <Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL <Invio>.
 
 Se si modifica in qualche modo il testo di un file e poi si visita un
 altro file questo non comporta il salvataggio del primo.  Le modifiche
@@ -752,7 +752,7 @@ salvataggio automatico.
 Se il computer si blocca si può recuperare il file salvato
 automaticamente aprendo il file in modo normale (il file che si stava
 scrivendo, non quello di salvataggio automatico) e usando poi M-x
-recover-this-file<Invio>.  Quando viene chiesta la conferma si risponda
+recover-this-file <Invio>.  Quando viene chiesta la conferma si risponda
 con yes<Invio> per procedere con il recupero dei dati salvati
 automaticamente.
 
@@ -818,7 +818,7 @@ fundamental-mode è il comando per attivare la modalità 
primaria
 Se si vuole inserire del testo in italiano, come questo file,
 probabilmente è più adeguata la modalità testo.
 
->> Inserisci M-x text-mode<Invio>.
+>> Inserisci M-x text-mode <Invio>.
 
 Non preoccuparti, nessuno dei comandi che hai imparato verrà
 modificato in modo sostanziale.  Tuttavia adesso puoi osservare come
@@ -853,14 +853,14 @@ testo, è la modalità “Auto Fill” (riempimento 
automatico).  Quando
 questa modalità è attiva, Emacs interrompe la riga tra due parole ogni
 volta che, nel corso dell'inserimento, essa diventa troppo lunga.
 
-Si può attivare il modo “Auto Fill” con M-x auto-fill-mode<Invio>.
+Si può attivare il modo “Auto Fill” con M-x auto-fill-mode <Invio>.
 Quando la modalità suddetta è attiva può essere disattivata eseguendo
-di nuovo M-x auto-fill-mode<Invio>.  Se la modalità è disattivata
+di nuovo M-x auto-fill-mode <Invio>.  Se la modalità è disattivata
 questo comando la attiva, viceversa se è già attiva.  Un comando che
 funziona così si comporta come un interruttore, attiva o disattiva
 qualcosa ogni volta che viene premuto.
 
->> Usa M-x auto fill mode<Invio> adesso.  Inserisci una riga di “asdf ”
+>> Usa M-x auto fill mode <Invio> adesso.  Inserisci una riga di “asdf ”
    ripetuti fino a quando non la vedi dividersi in due righe.  Devi
    interporre degli spazi perché la modalità Auto Fill spezza le righe
    solo in corrispondenza di uno spazio.
@@ -1021,13 +1021,13 @@ chiamano “finestra”, ed è possibile mostrarne più di uno
 contemporaneamente.  Su un terminale testuale, è possibile mostrare un
 solo frame alla volta.
 
->> Usa M-x make-frame<Invio>.
+>> Usa M-x make-frame <Invio>.
    Un nuovo frame dovrebbe apparire sullo schermo.
 
 In questo nuovo frame puoi svolgere qualsiasi cosa come nel frame
 originale.  Non c'è nulla di speciale nel primo frame.
 
->> Usa M-x delete-frame<Invio>.
+>> Usa M-x delete-frame <Invio>.
    Questo rimuove il frame selezionato.
 
 Puoi anche eliminare un frame usando i metodi offerti dal sistema
@@ -1076,7 +1076,7 @@ aiuto che può fornire.  Se si è attivato l'aiuto con C-h 
e si decide
 che non serve più si può annullare la richiesta con C-g.
 
 (Se C-h non mostra un messaggio relativo all'aiuto nella parte bassa
-dello schermo, prova ad usare il tasto F1 oppure con M-x help<Invio>.)
+dello schermo, prova ad usare il tasto F1 oppure con M-x help <Invio>.)
 
 La forma base di aiuto è data da C-h c.  Si inserisce C-h, il
 carattere c e poi un carattere o una sequenza di caratteri; Emacs
@@ -1110,9 +1110,9 @@ mentre fai riferimento al testo di aiuto e poi usare un 
C-x 1.
 
 Ecco altre utili opzioni di C-h:
 
-       C-h f   Descrive una funzione.  Inserisci il nome della funzione.
+       C-h x   Descrive un comando.  Inserisci il nome della comando.
 
->> Prova con C-h f previous-line<Invio>.
+>> Prova con C-h x previous-line <Invio>.
    Questo mostrerà tutte le informazioni che Emacs possiede sulla
    funzione che implementa il comando C-p.
 
@@ -1128,7 +1128,7 @@ variabile quando Emacs lo richiede.
                una sequenza di uno o due caratteri che serve a far
                partire il comando senza doverlo inserire per esteso.
 
->> Prova C-h a file<Invio>
+>> Prova C-h a file <Invio>
 
 Questo mostrerà in un'altra finestra una lista di tutti i comandi che
 contengono la parola “file” nel nome.  Nella lista si vedranno
@@ -1143,7 +1143,7 @@ esteso come find-file.
    C-h i       Leggi la documentazione.  Questo comando apre un
                buffer speciale chiamato “*info*” in cui puoi leggere
                i manuali on-line dei pacchetti installati sul tuo
-               sistema.  Batti m emacs<Invio> per leggere il manuale
+               sistema.  Batti m emacs <Invio> per leggere il manuale
                di Emacs.  Se non hai mai usato il sistema Info prima
                d'ora premi ? ed Emacs ti guiderà nell'uso delle
                opzioni del modo Info.  Una volta terminata questa
diff --git a/etc/tutorials/TUTORIAL.sv b/etc/tutorials/TUTORIAL.sv
index 1eab267..dacc66d 100644
--- a/etc/tutorials/TUTORIAL.sv
+++ b/etc/tutorials/TUTORIAL.sv
@@ -1056,10 +1056,10 @@ att först senare ta bort fönstret med C-x 1.
 
 Här är fler varianter på C-h:
 
-   C-h f        Beskriv en funktion. Du skriver in funktionsnamnet.
+   C-h x        Beskriv ett kommando. Du skriver in kommandots namn.
 
->> Prova att skriva C-h f previous-line<Return>.
-   Detta ger den information Emacs har om funktionen
+>> Prova att skriva C-h x previous-line <Return>.
+   Detta visar den information Emacs har om den funktion
    som implementerar kommandot C-p.
 
 Ett liknande kommando, C-h v, visar dokumentationen för de variabler
diff --git a/leim/Makefile.in b/leim/Makefile.in
index 2646abc..ce1029a 100644
--- a/leim/Makefile.in
+++ b/leim/Makefile.in
@@ -137,7 +137,7 @@ ${srcdir}/../lisp/language/pinyin.el: 
${srcdir}/MISC-DIC/pinyin.map
        $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f pinyin-convert $< $@
 
 
-.PHONY: bootstrap-clean distclean maintainer-clean extraclean gen-clean
+.PHONY: bootstrap-clean distclean maintainer-clean gen-clean
 
 ## Perhaps this should run gen-clean.
 bootstrap-clean:
@@ -154,6 +154,4 @@ gen-clean:
        rm -f ${TIT_MISC} ${leimdir}/leim-list.el
        rm -rf ${leimdir}/ja-dic
 
-extraclean: maintainer-clean
-
 ### Makefile.in ends here
diff --git a/lib-src/Makefile.in b/lib-src/Makefile.in
index 923d0cf..7af89eb 100644
--- a/lib-src/Makefile.in
+++ b/lib-src/Makefile.in
@@ -315,7 +315,7 @@ $(DESTDIR)${archlibdir}: all
        fi
 
 .PHONY: install uninstall mostlyclean clean distclean maintainer-clean
-.PHONY: bootstrap-clean extraclean check tags
+.PHONY: bootstrap-clean check tags
 
 install: $(DESTDIR)${archlibdir}
        @echo
@@ -343,6 +343,7 @@ mostlyclean:
        rm -f core ./*.o ./*.res
 
 clean: mostlyclean
+       -rm -f seccomp-filter.bpf seccomp-filter.pfc seccomp-filter-exec.bpf 
seccomp-filter-exec.pfc
        rm -f ${EXE_FILES}
 
 distclean: clean
@@ -350,8 +351,6 @@ distclean: clean
 
 bootstrap-clean maintainer-clean: distclean
 
-extraclean: maintainer-clean
-       rm -f ./*~ \#*
 
 ## Test the contents of the directory.
 check:
diff --git a/lib-src/etags.c b/lib-src/etags.c
index d79c6f4..72498bb 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -142,7 +142,14 @@ University of California, as described above. */
 # define CTAGS false
 #endif
 
-/* Copy to DEST from SRC (containing LEN bytes), and append a NUL byte.  */
+/* Define MERCURY_HEURISTICS_RATIO as it was necessary to disambiguate
+   Mercury from Objective C, which have same file extensions .m
+   See comments before function test_objc_is_mercury for details.  */
+#ifndef  MERCURY_HEURISTICS_RATIO
+# define MERCURY_HEURISTICS_RATIO 0.5
+#endif
+
+/* COPY to DEST from SRC (containing LEN bytes), and append a NUL byte.  */
 static void
 memcpyz (void *dest, void const *src, ptrdiff_t len)
 {
@@ -359,6 +366,7 @@ static void HTML_labels (FILE *);
 static void Lisp_functions (FILE *);
 static void Lua_functions (FILE *);
 static void Makefile_targets (FILE *);
+static void Mercury_functions (FILE *);
 static void Pascal_functions (FILE *);
 static void Perl_functions (FILE *);
 static void PHP_functions (FILE *);
@@ -366,6 +374,7 @@ static void PS_functions (FILE *);
 static void Prolog_functions (FILE *);
 static void Python_functions (FILE *);
 static void Ruby_functions (FILE *);
+static void Rust_entries (FILE *);
 static void Scheme_functions (FILE *);
 static void TeX_commands (FILE *);
 static void Texinfo_nodes (FILE *);
@@ -378,6 +387,7 @@ static ptrdiff_t readline_internal (linebuffer *, FILE *, 
char const *);
 static bool nocase_tail (const char *);
 static void get_tag (char *, char **);
 static void get_lispy_tag (char *);
+static void test_objc_is_mercury (char *, language **);
 
 static void analyze_regex (char *);
 static void free_regexps (void);
@@ -683,10 +693,22 @@ static const char Makefile_help [] =
 "In makefiles, targets are tags; additionally, variables are tags\n\
 unless you specify '--no-globals'.";
 
+/* Mercury and Objective C share the same .m file extensions.  */
+static const char *Mercury_suffixes [] =
+  {"m",
+   NULL};
+static const char Mercury_help [] =
+  "In Mercury code, tags are all declarations beginning a line with ':-'\n\
+and optionally Prolog-like definitions (first rule for a predicate or \
+function).\n\
+To enable this behavior, run etags using --declarations.";
+static bool with_mercury_definitions = false;
+float mercury_heuristics_ratio = MERCURY_HEURISTICS_RATIO;
+
 static const char *Objc_suffixes [] =
-  { "lm",                      /* Objective lex file */
-    "m",                       /* Objective C file */
-     NULL };
+  { "lm",                      /* Objective lex file  */
+    "m",                       /* By default, Objective C file will be 
assumed.  */
+     NULL};
 static const char Objc_help [] =
 "In Objective C code, tags include Objective C definitions for classes,\n\
 class categories, methods and protocols.  Tags for variables and\n\
@@ -752,6 +774,12 @@ a line generate a tag.  Constants also generate a tag.";
 static const char *Ruby_interpreters [] =
   { "ruby", NULL };
 
+static const char *Rust_suffixes [] =
+  { "rs", NULL };
+static const char Rust_help [] =
+  "In Rust code, tags anything defined with 'fn', 'enum', \n\
+'struct' or 'macro_rules!'.";
+
 /* Can't do the `SCM' or `scm' prefix with a version number. */
 static const char *Scheme_suffixes [] =
   { "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
@@ -824,7 +852,9 @@ static language lang_names [] =
   { "lisp",      Lisp_help,      Lisp_functions,    Lisp_suffixes      },
   { "lua",       Lua_help,Lua_functions,Lua_suffixes,NULL,Lua_interpreters},
   { "makefile",  Makefile_help,Makefile_targets,NULL,Makefile_filenames},
+  /* objc listed before mercury as it is a better default for .m extensions.  
*/
   { "objc",      Objc_help,      plain_C_entries,   Objc_suffixes      },
+  { "mercury",   Mercury_help,   Mercury_functions, Mercury_suffixes   },
   { "pascal",    Pascal_help,    Pascal_functions,  Pascal_suffixes    },
   { "perl",Perl_help,Perl_functions,Perl_suffixes,NULL,Perl_interpreters},
   { "php",       PHP_help,       PHP_functions,     PHP_suffixes       },
@@ -836,6 +866,7 @@ static language lang_names [] =
                  NULL,           Python_interpreters },
   { "ruby",      Ruby_help,      Ruby_functions,    Ruby_suffixes,
                  Ruby_filenames, Ruby_interpreters },
+  { "rust",      Rust_help,      Rust_entries,      Rust_suffixes      },
   { "scheme",    Scheme_help,    Scheme_functions,  Scheme_suffixes    },
   { "tex",       TeX_help,       TeX_commands,      TeX_suffixes       },
   { "texinfo",   Texinfo_help,   Texinfo_nodes,     Texinfo_suffixes   },
@@ -950,6 +981,9 @@ Relative ones are stored relative to the output file's 
directory.\n");
     puts
       ("\tand create tags for extern variables unless --no-globals is used.");
 
+  puts ("In Mercury, tag both declarations starting a line with ':-' and 
first\n\
+        predicates or functions in clauses.");
+
   if (CTAGS)
     puts ("-d, --defines\n\
         Create tag entries for C #define constants and enum constants, too.");
@@ -1776,6 +1810,11 @@ find_entries (FILE *inf)
   if (parser == NULL)
     {
       lang = get_language_from_filename (curfdp->infname, true);
+
+      /* Disambiguate file names between Objc and Mercury. */
+      if (lang != NULL && strcmp (lang->name, "objc") == 0)
+       test_objc_is_mercury (curfdp->infname, &lang);
+
       if (lang != NULL && lang->function != NULL)
        {
          curfdp->lang = lang;
@@ -5022,6 +5061,49 @@ Ruby_functions (FILE *inf)
 
 
 /*
+ * Rust support
+ * Look for:
+ *  - fn: Function
+ *  - struct: Structure
+ *  - enum: Enumeration
+ *  - macro_rules!: Macro
+ */
+static void
+Rust_entries (FILE *inf)
+{
+  char *cp, *name;
+  bool is_func = false;
+
+  LOOP_ON_INPUT_LINES(inf, lb, cp)
+    {
+      cp = skip_spaces(cp);
+      name = cp;
+
+      // Skip 'pub' keyworld
+      (void)LOOKING_AT (cp, "pub");
+
+      // Look for define
+      if ((is_func = LOOKING_AT (cp, "fn"))
+         || LOOKING_AT (cp, "enum")
+         || LOOKING_AT (cp, "struct")
+         || (is_func = LOOKING_AT (cp, "macro_rules!")))
+       {
+         cp = skip_spaces (cp);
+         name = cp;
+
+         while (!notinname (*cp))
+           cp++;
+
+         make_tag (name, cp - name, is_func,
+                   lb.buffer, cp - lb.buffer + 1,
+                   lineno, linecharno);
+         is_func = false;
+       }
+    }
+}
+
+
+/*
  * PHP support
  * Look for:
  *  - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
@@ -6000,10 +6082,10 @@ prolog_atom (char *s, size_t pos)
              pos++;
              if (s[pos] != '\'')
                break;
-             pos++;            /* A double quote */
+             pos++;            /* A double quote  */
            }
          else if (s[pos] == '\0')
-           /* Multiline quoted atoms are ignored. */
+           /* Multiline quoted atoms are ignored.  */
            return 0;
          else if (s[pos] == '\\')
            {
@@ -6022,6 +6104,510 @@ prolog_atom (char *s, size_t pos)
 
 
 /*
+ * Support for Mercury
+ *
+ * Assumes that the declarations start at column 0.
+ * Original code by Sunichirou Sugou (1989) for Prolog.
+ * Rewritten by Anders Lindgren (1996) for Prolog.
+ * Adapted by Fabrice Nicol (2021) for Mercury.
+ * Note: Prolog-support behavior is preserved if
+ * --declarations is used, corresponding to
+ * with_mercury_definitions=true.
+ */
+
+static ptrdiff_t mercury_pr (char *, char *, ptrdiff_t);
+static void mercury_skip_comment (linebuffer *, FILE *);
+static bool is_mercury_type = false;
+static bool is_mercury_quantifier = false;
+static bool is_mercury_declaration = false;
+typedef struct
+{
+  size_t pos;          /* Position reached in parsing tag name.  */
+  size_t namelength;   /* Length of tag name  */
+  size_t totlength;    /* Total length of parsed tag: this field is currently
+                         reserved for control and debugging.   */
+} mercury_pos_t;
+
+/*
+ * Objective-C and Mercury have identical file extension .m.
+ * To disambiguate between Objective C and Mercury, parse file
+ * with the following heuristics hook:
+ *   - if line starts with :-, choose Mercury unconditionally;
+ *   - if line starts with #, @, choose Objective-C;
+ *   - otherwise compute the following ratio:
+ *
+ *     r = (number of lines with :-
+ *          or % in non-commented parts or . at trimmed EOL)
+ *         / (number of lines - number of lines starting by any amount
+ *                        of whitespace, optionally followed by comment(s))
+ *
+ * Note: strings are neglected in counts.
+ *
+ * If r > mercury_heuristics_ratio, choose Mercury.
+ * Experimental tests show that a possibly optimal default value for
+ * this floor value is around 0.5.  This is the default value for
+ * MERCURY_HEURISTICS_RATIO, defined in the first lines of this file.
+ * The closer r is to 0.5, the closer the source code to pure Prolog.
+ * Idiomatic Mercury is scored either with r = 1.0 or higher.
+ * Objective-C is scored with r = 0.0.  When this fails, the r-score
+ * never rose above 0.1 in Objective-C tests.
+ */
+
+static void
+test_objc_is_mercury (char *this_file, language **lang)
+{
+  if (this_file == NULL) return;
+  FILE* fp = fopen (this_file, "r");
+  if (fp == NULL)
+    pfatal (this_file);
+
+  bool blank_line = false; /* Line starting with any amount of white space
+                             followed by optional comment(s).  */
+  bool commented_line = false;
+  bool found_dot = false;
+  bool only_space_before = true;
+  bool start_of_line = true;
+  int c;
+  intmax_t lines = 1;
+  intmax_t mercury_dots = 0;
+  intmax_t percentage_signs = 0;
+  intmax_t rule_signs = 0;
+  float ratio = 0;
+
+  while ((c = fgetc (fp)) != EOF)
+    {
+      switch (c)
+       {
+       case '\n':
+         if (! blank_line) ++lines;
+         blank_line = true;
+         commented_line = false;
+         start_of_line = true;
+         if (found_dot) ++mercury_dots;
+         found_dot = false;
+         only_space_before = true;
+         break;
+       case '.':
+         found_dot = ! commented_line;
+         only_space_before = false;
+         break;
+       case  '%': /* More frequent in Mercury.  May be modulo in Obj.-C.  */
+         if (! commented_line)
+           {
+             ++percentage_signs;
+             /* Cannot tell if it is a comment or modulo yet for sure.
+                 Yet works for heuristic purposes.  */
+             commented_line = true;
+           }
+         found_dot = false;
+         start_of_line = false;
+         only_space_before = false;
+         break;
+       case  '/':
+         {
+           int d = fgetc (fp);
+           found_dot = false;
+           only_space_before = false;
+           if (! commented_line)
+             {
+               if (d == '*')
+                 commented_line = true;
+               else
+                 /* If d == '/', cannot tell if it is an Obj.-C comment:
+                    may be Mercury integ. division.  */
+                   blank_line = false;
+             }
+         }
+         FALLTHROUGH;
+        case  ' ':
+        case '\t':
+         start_of_line = false;
+         break;
+        case ':':
+         c = fgetc (fp);
+         if (start_of_line)
+           {
+             if (c == '-')
+               {
+                 ratio = 1.0; /* Failsafe, not an operator in Obj.-C.  */
+                 goto out;
+               }
+             start_of_line = false;
+           }
+         else
+           {
+             /* p :- q.  Frequent in Mercury.
+                Rare or in quoted exprs in Obj.-C.  */
+             if (c == '-' && ! commented_line)
+               ++rule_signs;
+           }
+         blank_line = false;
+         found_dot = false;
+         only_space_before = false;
+          break;
+       case '@':
+        case '#':
+         if (start_of_line || only_space_before)
+           {
+             ratio = 0.0;
+             goto out;
+           }
+         FALLTHROUGH;
+       default:
+         start_of_line = false;
+         blank_line = false;
+         found_dot = false;
+         only_space_before = false;
+       }
+    }
+
+  /* Fallback heuristic test.  Not failsafe but errless in pratice.  */
+  ratio = ((float) rule_signs + percentage_signs + mercury_dots) / lines;
+
+ out:
+  if (fclose (fp) == EOF)
+    pfatal (this_file);
+
+  if (ratio > mercury_heuristics_ratio)
+    {
+      /* Change the language from Objective-C to Mercury.  */
+      static language lang0 = { "mercury", Mercury_help, Mercury_functions,
+       Mercury_suffixes };
+      *lang = &lang0;
+    }
+}
+
+static void
+Mercury_functions (FILE *inf)
+{
+  char *cp, *last = NULL;
+  ptrdiff_t lastlen = 0, allocated = 0;
+  if (declarations) with_mercury_definitions = true;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      if (cp[0] == '\0')   /* Empty line.  */
+       continue;
+      else if (c_isspace (cp[0]) || cp[0] == '%')
+       /*  A Prolog-type comment or anything other than a declaration.  */
+       continue;
+      else if (cp[0] == '/' && cp[1] == '*')  /* Mercury C-type comment.  */
+        mercury_skip_comment (&lb, inf);
+      else
+       {
+         is_mercury_declaration = (cp[0] == ':' && cp[1] == '-');
+
+          if (is_mercury_declaration
+             || with_mercury_definitions)
+           {
+             ptrdiff_t len = mercury_pr (cp, last, lastlen);
+             if (0 < len)
+               {
+                 /* Store the declaration to avoid generating duplicate
+                    tags later.  */
+                 if (allocated <= len)
+                   {
+                     xrnew (last, len + 1, 1);
+                     allocated = len + 1;
+                   }
+                 memcpyz (last, cp, len);
+                 lastlen = len;
+               }
+           }
+       }
+    }
+  free (last);
+}
+
+static void
+mercury_skip_comment (linebuffer *plb, FILE *inf)
+{
+  char *cp;
+
+  do
+    {
+      for (cp = plb->buffer; *cp != '\0'; ++cp)
+       if (cp[0] == '*' && cp[1] == '/')
+         return;
+      readline (plb, inf);
+    }
+  while (perhaps_more_input (inf));
+}
+
+/*
+ * A declaration is added if it matches:
+ *     <beginning of line>:-<whitespace><Mercury Term><whitespace>(
+ * If with_mercury_definitions == true, we also add:
+ *     <beginning of line><Mercury item><whitespace>(
+ * or  <beginning of line><Mercury item><whitespace>:-
+ * As for Prolog support, different arities and types are not taken into
+ * consideration.
+ * Item is added to the tags database if it doesn't match the
+ * name of the previous declaration.
+ *
+ * Consume a Mercury declaration.
+ * Return the number of bytes consumed, or 0 if there was an error.
+ *
+ * A Mercury declaration must be one of:
+ *  :- type
+ *  :- solver type
+ *  :- pred
+ *  :- func
+ *  :- inst
+ *  :- mode
+ *  :- typeclass
+ *  :- instance
+ *  :- pragma
+ *  :- promise
+ *  :- initialise
+ *  :- finalise
+ *  :- mutable
+ *  :- module
+ *  :- interface
+ *  :- implementation
+ *  :- import_module
+ *  :- use_module
+ *  :- include_module
+ *  :- end_module
+ * followed on the same line by an alphanumeric sequence, starting with a lower
+ * case letter or by a single-quoted arbitrary string.
+ * Single quotes can escape themselves.  Backslash quotes everything.
+ *
+ * Return the size of the name of the declaration or 0 if no header was found.
+ * As quantifiers may precede functions or predicates, we must list them too.
+ */
+
+static const char *Mercury_decl_tags[] = {"type", "solver type", "pred",
+  "func", "inst", "mode", "typeclass", "instance", "pragma", "promise",
+  "initialise", "finalise", "mutable", "module", "interface", "implementation",
+  "import_module", "use_module", "include_module", "end_module", "some", 
"all"};
+
+static mercury_pos_t
+mercury_decl (char *s, size_t pos)
+{
+  mercury_pos_t null_pos = {0, 0, 0};
+
+  if (s == NULL) return null_pos;
+
+  size_t origpos;
+  origpos = pos;
+
+  while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_')) ++pos;
+
+  unsigned char decl_type_length = pos - origpos;
+  char buf[decl_type_length + 1];
+  memset (buf, 0, decl_type_length + 1);
+
+  /* Mercury declaration tags.  Consume them, then check the declaration item
+     following :- is legitimate, then go on as in the prolog case.  */
+
+  memcpy (buf, &s[origpos], decl_type_length);
+
+  bool found_decl_tag = false;
+
+  if (is_mercury_quantifier)
+    {
+      if (strcmp (buf, "pred") != 0 && strcmp (buf, "func") != 0) /* Bad 
syntax.  */
+       return null_pos;
+
+      is_mercury_quantifier = false; /* Reset to base value.  */
+      found_decl_tag = true;
+    }
+  else
+    {
+      for (int j = 0; j < sizeof (Mercury_decl_tags) / sizeof (char*); ++j)
+       {
+         if (strcmp (buf, Mercury_decl_tags[j]) == 0)
+           {
+             found_decl_tag = true;
+             if (strcmp (buf, "type") == 0)
+               is_mercury_type = true;
+
+             if (strcmp (buf, "some") == 0
+                 || strcmp (buf, "all") == 0)
+               {
+                 is_mercury_quantifier = true;
+               }
+
+             break;  /* Found declaration tag of rank j.  */
+           }
+         else
+           /* 'solver type' has a blank in the middle,
+              so this is the hard case.  */
+           if (strcmp (buf, "solver") == 0)
+             {
+               ++pos;
+               while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_'))
+                 ++pos;
+
+               decl_type_length = pos - origpos;
+               char buf2[decl_type_length + 1];
+               memset (buf2, 0, decl_type_length + 1);
+               memcpy (buf2, &s[origpos], decl_type_length);
+
+               if (strcmp (buf2, "solver type") == 0)
+                 {
+                   found_decl_tag = false;
+                   break;  /* Found declaration tag of rank j.  */
+                 }
+             }
+       }
+    }
+
+  /* If with_mercury_definitions == false
+   * this is a Mercury syntax error, ignoring... */
+
+  if (with_mercury_definitions)
+    {
+      if (found_decl_tag)
+       pos = skip_spaces (s + pos) - s; /* Skip len blanks again.  */
+      else
+       /* Prolog-like behavior
+        * we have parsed the predicate once, yet inappropriately
+        * so restarting again the parsing step.  */
+       pos = 0;
+    }
+  else
+    {
+      if (found_decl_tag)
+       pos = skip_spaces (s + pos) - s; /* Skip len blanks again.  */
+      else
+       return null_pos;
+    }
+
+  /* From now on it is the same as for Prolog except for module dots.  */
+
+  size_t start_of_name = pos;
+
+  if (c_islower (s[pos]) || s[pos] == '_' )
+    {
+      /* The name is unquoted.
+         Do not confuse module dots with end-of-declaration dots.  */
+      int module_dot_pos = 0;
+
+      while (c_isalnum (s[pos])
+             || s[pos] == '_'
+             || (s[pos] == '.' /* A module dot.  */
+                 && s + pos + 1 != NULL
+                 && (c_isalnum (s[pos + 1]) || s[pos + 1] == '_')
+                && (module_dot_pos = pos)))  /* Record module dot position.
+                                                Erase module from name.  */
+       ++pos;
+
+      if (module_dot_pos)
+       {
+         start_of_name = module_dot_pos + 2;
+         ++pos;
+        }
+
+      mercury_pos_t position = {pos, pos - start_of_name + 1, pos - origpos};
+      return position;
+    }
+  else if (s[pos] == '\'')
+    {
+      ++pos;
+      for (;;)
+       {
+         if (s[pos] == '\'')
+           {
+             ++pos;
+             if (s[pos] != '\'')
+               break;
+             ++pos; /* A double quote.  */
+           }
+         else if (s[pos] == '\0')  /* Multiline quoted atoms are ignored.  */
+           return null_pos;
+         else if (s[pos] == '\\')
+           {
+             if (s[pos+1] == '\0')
+               return null_pos;
+             pos += 2;
+           }
+         else
+           ++pos;
+       }
+
+      mercury_pos_t position = {pos, pos - start_of_name + 1, pos - origpos};
+      return position;
+    }
+  else if (is_mercury_quantifier && s[pos] == '[')   /* :- some [T] pred/func. 
 */
+    {
+      for (++pos; s + pos != NULL && s[pos] != ']'; ++pos) {}
+      if (s + pos == NULL) return null_pos;
+      ++pos;
+      pos = skip_spaces (s + pos) - s;
+      mercury_pos_t position = mercury_decl (s, pos);
+      position.totlength += pos - origpos;
+      return position;
+    }
+  else if (s[pos] == '.')  /* as in ':- interface.'  */
+    {
+      mercury_pos_t position = {pos, pos - origpos + 1, pos - origpos};
+      return position;
+    }
+  else
+    return null_pos;
+}
+
+static ptrdiff_t
+mercury_pr (char *s, char *last, ptrdiff_t lastlen)
+{
+  size_t len0 = 0;
+  is_mercury_type = false;
+  is_mercury_quantifier = false;
+  bool stop_at_rule = false;
+
+  if (is_mercury_declaration)
+    {
+      /* Skip len0 blanks only for declarations.  */
+      len0 = skip_spaces (s + 2) - s;
+    }
+
+  mercury_pos_t position = mercury_decl (s, len0);
+  size_t pos = position.pos;
+  int offset = 0;  /* may be < 0  */
+  if (pos == 0) return 0;
+
+  /* Skip white space for:
+     a. rules in definitions before :-
+     b. 0-arity predicates with inlined modes.
+     c. possibly multiline type definitions  */
+
+  while (c_isspace (s[pos])) { ++pos; ++offset; }
+
+  if (( ((s[pos] == '.' && (pos += 1))     /* case 1
+                                              This is a statement dot,
+                                              not a module dot. */
+        || c_isalnum(s[pos])              /* 0-arity procedures  */
+        || (s[pos] == '(' && (pos += 1))  /* case 2: arity > 0   */
+        || ((s[pos] == ':')               /* case 3: rules  */
+            && s[pos + 1] == '-' && (stop_at_rule = true)))
+     && (lastlen != pos || memcmp (s, last, pos) != 0)
+       )
+      /* Types are often declared on several lines so keeping just
+        the first line.  */
+
+      || is_mercury_type)  /* When types are implemented.  */
+    {
+      size_t namelength = position.namelength;
+      if (stop_at_rule && offset) --offset;
+
+      /* Left-trim type definitions.  */
+
+      while (pos > namelength + offset
+            && c_isspace (s[pos - namelength - offset]))
+       --offset;
+
+      make_tag (s + pos - namelength - offset, namelength - 1, true,
+                               s, pos - offset - 1, lineno, linecharno);
+      return pos;
+    }
+
+  return 0;
+}
+
+
+/*
  * Support for Erlang
  *
  * Generates tags for functions, defines, and records.
diff --git a/lib/Makefile.in b/lib/Makefile.in
index 68a0247..ccb90c3 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -64,12 +64,14 @@ endif
 ../config.status: $(top_srcdir)/configure.ac $(top_srcdir)/m4/*.m4
        $(MAKE) -C .. $(notdir $@)
 Makefile: ../config.status $(srcdir)/Makefile.in
-       $(MAKE) -C .. src/$@
+       $(MAKE) -C .. lib/$@
 
 # Object modules that need not be built for Emacs.
 # Emacs does not need e-regex.o (it has its own regex-emacs.c),
 # and building it would just waste time.
-not_emacs_OBJECTS = regex.o
+# Emacs also doesn't need the dynarray-related files in malloc/ and
+# the replacement 'free'.
+not_emacs_OBJECTS = regex.o malloc/%.o free.o
 
 libgnu_a_OBJECTS = fingerprint.o $(gl_LIBOBJS) \
   $(patsubst %.c,%.o,$(filter %.c,$(libgnu_a_SOURCES)))
@@ -113,8 +115,7 @@ distclean bootstrap-clean: mostlyclean
        rm -fr $(DEPDIR)
 maintainer-clean: distclean
        rm -f TAGS gnulib.mk
-extraclean: distclean
-       -rmdir malloc sys 2>/dev/null
+       -rmdir malloc sys 2>/dev/null || true
 
 .PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
 
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index b970451..431217a 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -202,7 +202,7 @@ $(lisp)/loaddefs.el: gen-lisp $(LOADDEFS)
 # regeneration of all these files.
 .PHONY: autoloads-force
 autoloads-force:
-       rm loaddefs.el
+       rm -f $(lisp)/loaddefs.el
        $(MAKE) autoloads
 
 # This is required by the bootstrap-emacs target in ../src/Makefile, so
@@ -274,7 +274,7 @@ $(THEFILE)c:
 ifeq ($(HAVE_NATIVE_COMP),yes)
        $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \
                -l comp -f byte-compile-refresh-preloaded \
-               -f batch-byte-native-compile-for-bootstrap $(THEFILE)
+               -f batch-byte+native-compile $(THEFILE)
 else
        $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \
                -l bytecomp -f byte-compile-refresh-preloaded \
@@ -295,7 +295,7 @@ endif
 ifeq ($(HAVE_NATIVE_COMP),yes)
 .el.elc:
        $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \
-       -l comp -f batch-byte-native-compile-for-bootstrap $<
+       -l comp -f batch-byte+native-compile $<
 else
 .el.elc:
        $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) -f batch-byte-compile $<
@@ -467,7 +467,7 @@ $(CAL_DIR)/hol-loaddefs.el: $(CAL_SRC) 
$(CAL_DIR)/diary-loaddefs.el
           --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
           -f batch-update-autoloads $(CAL_DIR)
 
-.PHONY: bootstrap-clean distclean maintainer-clean extraclean
+.PHONY: bootstrap-clean distclean maintainer-clean
 
 bootstrap-clean:
        find $(lisp) -name '*.elc' $(FIND_DELETE)
@@ -479,12 +479,6 @@ distclean:
 maintainer-clean: distclean bootstrap-clean
        rm -f TAGS
 
-extraclean: bootstrap-clean distclean
-       -for file in $(loaddefs); do rm -f $${file}~; done
-       -rm -f $(lisp)/loaddefs.el~
-       -find $(lisp) -name '*~' $(FIND_DELETE)
-       -find $(lisp) -name '#*' $(FIND_DELETE)
-
 .PHONY: check-declare
 
 check-declare:
diff --git a/lisp/allout.el b/lisp/allout.el
index 1605ce2..0625ea6 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -2490,10 +2490,10 @@ We skip anomalous low-level topics, a la 
`allout-aberrant-container-p'."
 
 ;;;_  - Subtree Charting
 ;;;_   " These routines either produce or assess charts, which are
-;;; nested lists of the locations of topics within a subtree.
-;;;
-;;; Charts enable efficient subtree navigation by providing a reusable basis
-;;; for elaborate, compound assessment and adjustment of a subtree.
+;; nested lists of the locations of topics within a subtree.
+;;
+;; Charts enable efficient subtree navigation by providing a reusable basis
+;; for elaborate, compound assessment and adjustment of a subtree.
 
 ;;;_   > allout-chart-subtree (&optional levels visible orig-depth prev-depth)
 (defun allout-chart-subtree (&optional levels visible orig-depth prev-depth)
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 86cdf23..f246064 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -96,6 +96,11 @@ include key-binding information in its output."
   "Face for property name in Apropos output, or nil for none."
   :version "24.3")
 
+(defface apropos-button
+  '((t (:inherit (font-lock-variable-name-face button))))
+  "Face for buttons that indicate a face in Apropos."
+  :version "28.1")
+
 (defface apropos-function-button
   '((t (:inherit (font-lock-function-name-face button))))
   "Button face indicating a function, macro, or command in Apropos."
@@ -145,11 +150,11 @@ If value is `verbose', the computed score is shown for 
each match."
     ;; Use `apropos-follow' instead of just using the button
     ;; definition of RET, so that users can use it anywhere in an
     ;; apropos item, not just on top of a button.
-    (define-key map "\C-m" 'apropos-follow)
+    (define-key map "\C-m" #'apropos-follow)
 
     ;; Movement keys
-    (define-key map "n" 'apropos-next-symbol)
-    (define-key map "p" 'apropos-previous-symbol)
+    (define-key map "n" #'apropos-next-symbol)
+    (define-key map "p" #'apropos-previous-symbol)
     map)
   "Keymap used in Apropos mode.")
 
@@ -276,7 +281,7 @@ before `apropos-mode' makes it buffer-local.")
 (define-button-type 'apropos-face
   'apropos-label "Face"
   'apropos-short-label "F"
-  'face '(font-lock-variable-name-face button)
+  'face 'apropos-button
   'help-echo "mouse-2, RET: Display more help on this face"
   'follow-link t
   'action (lambda (button)
@@ -347,7 +352,7 @@ WILD should be a subexpression matching wildcards between 
matches."
      (lambda (w)
        (concat "\\(?:" w "\\)" ;; parens for synonyms
                wild "\\(?:"
-               (mapconcat 'identity
+               (mapconcat #'identity
                          (delq w (copy-sequence words))
                          "\\|")
                "\\)"))
@@ -389,14 +394,14 @@ This updates variables `apropos-pattern', 
`apropos-pattern-quoted',
       ;; use a trick that would find a match even if the words are
       ;; on different lines.
       (let ((words pattern))
-       (setq apropos-pattern (mapconcat 'identity pattern " ")
+       (setq apropos-pattern (mapconcat #'identity pattern " ")
              apropos-pattern-quoted (regexp-quote apropos-pattern))
        (dolist (word words)
          (let ((syn apropos-synonyms) (s word) (a word))
            (while syn
              (if (member word (car syn))
                  (progn
-                   (setq a (mapconcat 'identity (car syn) "\\|"))
+                   (setq a (mapconcat #'identity (car syn) "\\|"))
                    (if (member word (cdr (car syn)))
                        (setq s a))
                    (setq syn nil))
@@ -513,7 +518,7 @@ variables, not just user options."
                       #'(lambda (symbol)
                           (and (boundp symbol)
                                (get symbol 'variable-documentation)))
-                    'custom-variable-p)))
+                    #'custom-variable-p)))
 
 ;;;###autoload
 (defun apropos-variable (pattern &optional do-not-all)
@@ -556,7 +561,7 @@ or a non-nil `apropos-do-all' argument."
 
 ;; For auld lang syne:
 ;;;###autoload
-(defalias 'command-apropos 'apropos-command)
+(defalias 'command-apropos #'apropos-command)
 ;;;###autoload
 (defun apropos-command (pattern &optional do-all var-predicate)
   "Show commands (interactively callable functions) that match PATTERN.
@@ -685,7 +690,7 @@ FILE should be one of the libraries currently loaded and 
should
 thus be found in `load-history'.  If `apropos-do-all' is non-nil,
 the output includes key-bindings of commands."
   (interactive
-   (let* ((libs (delq nil (mapcar 'car load-history)))
+   (let* ((libs (delq nil (mapcar #'car load-history)))
           (libs
            (nconc (delq nil
                         (mapcar
@@ -731,9 +736,9 @@ the output includes key-bindings of commands."
         (format-message
                 "Library `%s' provides: %s\nand requires: %s"
                 file
-                (mapconcat 'apropos-library-button
+                (mapconcat #'apropos-library-button
                            (or provides '(nil)) " and ")
-                (mapconcat 'apropos-library-button
+                (mapconcat #'apropos-library-button
                            (or requires '(nil)) " and ")))))))
 
 (defun apropos-symbols-internal (symbols keys &optional text)
@@ -809,34 +814,34 @@ Returns list of symbols and values found."
   (apropos-parse-pattern pattern t)
   (or do-all (setq do-all apropos-do-all))
   (setq apropos-accumulator ())
-   (let (f v p)
-     (mapatoms
-      (lambda (symbol)
-       (setq f nil v nil p nil)
-       (or (memq symbol '(apropos-regexp
-                          apropos-pattern apropos-all-words-regexp
-                          apropos-words apropos-all-words
-                          do-all apropos-accumulator
-                          symbol f v p))
-           (setq v (apropos-value-internal 'boundp symbol 'symbol-value)))
-       (if do-all
-           (setq f (apropos-value-internal 'fboundp symbol 'symbol-function)
-                 p (apropos-format-plist symbol "\n    " t)))
-       (if (apropos-false-hit-str v)
-           (setq v nil))
-       (if (apropos-false-hit-str f)
-           (setq f nil))
-       (if (apropos-false-hit-str p)
-           (setq p nil))
-       (if (or f v p)
-           (setq apropos-accumulator (cons (list symbol
-                                                 (+ (apropos-score-str f)
-                                                    (apropos-score-str v)
-                                                    (apropos-score-str p))
-                                                 f v p)
-                                           apropos-accumulator))))))
-   (let ((apropos-multi-type do-all))
-     (apropos-print nil "\n----------------\n")))
+  (let (f v p)
+    (mapatoms
+     (lambda (symbol)
+       (setq f nil v nil p nil)
+       (or (memq symbol '(apropos-regexp
+                          apropos--current apropos-pattern-quoted pattern
+                         apropos-pattern apropos-all-words-regexp
+                         apropos-words apropos-all-words
+                         apropos-accumulator))
+           (setq v (apropos-value-internal #'boundp symbol #'symbol-value)))
+       (if do-all
+           (setq f (apropos-value-internal #'fboundp symbol #'symbol-function)
+                p (apropos-format-plist symbol "\n    " t)))
+       (if (apropos-false-hit-str v)
+           (setq v nil))
+       (if (apropos-false-hit-str f)
+           (setq f nil))
+       (if (apropos-false-hit-str p)
+           (setq p nil))
+       (if (or f v p)
+           (setq apropos-accumulator (cons (list symbol
+                                                (+ (apropos-score-str f)
+                                                   (apropos-score-str v)
+                                                   (apropos-score-str p))
+                                                f v p)
+                                          apropos-accumulator))))))
+  (let ((apropos-multi-type do-all))
+    (apropos-print nil "\n----------------\n")))
 
 ;;;###autoload
 (defun apropos-local-value (pattern &optional buffer)
@@ -851,9 +856,11 @@ Optional arg BUFFER (default: current buffer) is the 
buffer to check."
   (let ((var             nil))
     (mapatoms
      (lambda (symb)
-       (unless (memq symb '(apropos-regexp apropos-pattern 
apropos-all-words-regexp
-                            apropos-words apropos-all-words 
apropos-accumulator symb var))
-         (setq var  (apropos-value-internal 'local-variable-if-set-p symb 
'symbol-value)))
+       (unless (memq symb '(apropos-regexp apropos-pattern
+                            apropos-all-words-regexp apropos-words
+                            apropos-all-words apropos-accumulator))
+         (setq var  (apropos-value-internal #'local-variable-if-set-p symb
+                                            #'symbol-value)))
        (when (and (fboundp 'apropos-false-hit-str)  (apropos-false-hit-str 
var))
          (setq var nil))
        (when var
@@ -928,7 +935,13 @@ Returns list of symbols and documentation found."
 
 (defun apropos-value-internal (predicate symbol function)
   (when (funcall predicate symbol)
-    (setq symbol (prin1-to-string (funcall function symbol)))
+    (setq symbol (prin1-to-string
+                  (if (memq symbol '(command-history minibuffer-history))
+                      ;; The value we're looking for will always be in
+                      ;; the first element of these two lists, so skip
+                      ;; that value.
+                      (cdr (funcall function symbol))
+                    (funcall function symbol))))
     (when (string-match apropos-regexp symbol)
       (if apropos-match-face
           (put-text-property (match-beginning 0) (match-end 0)
diff --git a/lisp/auth-source-pass.el b/lisp/auth-source-pass.el
index a7b959c..914f8d2 100644
--- a/lisp/auth-source-pass.el
+++ b/lisp/auth-source-pass.el
@@ -6,8 +6,6 @@
 ;;         Nicolas Petton <nicolas@petton.fr>
 ;;         Keith Amidon <camalot@picnicpark.org>
 ;; Version: 5.0.0
-;; Package-Requires: ((emacs "25"))
-;; Url: https://github.com/DamienCassou/auth-password-store
 ;; Created: 07 Jun 2015
 
 ;; This file is part of GNU Emacs.
@@ -60,14 +58,12 @@
 (cl-defun auth-source-pass-search (&rest spec
                                          &key backend type host user port
                                          &allow-other-keys)
-  "Given a property list SPEC, return search matches from the :backend.
-See `auth-source-search' for details on SPEC."
+  "Given some search query, return matching credentials.
+
+See `auth-source-search' for details on the parameters SPEC, BACKEND, TYPE,
+HOST, USER and PORT."
   (cl-assert (or (null type) (eq type (oref backend type)))
              t "Invalid password-store search: %s %s")
-  (when (consp host)
-    (warn "auth-source-pass ignores all but first host in spec.")
-    ;; Take the first non-nil item of the list of hosts
-    (setq host (seq-find #'identity host)))
   (cond ((eq host t)
          (warn "auth-source-pass does not handle host wildcards.")
          nil)
@@ -78,12 +74,14 @@ See `auth-source-search' for details on SPEC."
          (when-let ((result (auth-source-pass--build-result host port user)))
            (list result)))))
 
-(defun auth-source-pass--build-result (host port user)
-  "Build auth-source-pass entry matching HOST, PORT and USER."
-  (let ((entry-data (auth-source-pass--find-match host user port)))
+(defun auth-source-pass--build-result (hosts port user)
+  "Build auth-source-pass entry matching HOSTS, PORT and USER.
+
+HOSTS can be a string or a list of strings."
+  (let ((entry-data (auth-source-pass--find-match hosts user port)))
     (when entry-data
       (let ((retval (list
-                     :host host
+                     :host (auth-source-pass--get-attr "host" entry-data)
                      :port (or (auth-source-pass--get-attr "port" entry-data) 
port)
                      :user (or (auth-source-pass--get-attr "user" entry-data) 
user)
                      :secret (lambda () (auth-source-pass--get-attr 'secret 
entry-data)))))
@@ -125,7 +123,7 @@ ENTRY is the name of a password-store entry.
 The key used to retrieve the password is the symbol `secret'.
 
 The convention used as the format for a password-store file is
-the following (see https://www.passwordstore.org/#organization):
+the following (see URL `https://www.passwordstore.org/#organization'):
 
 secret
 key1: value1
@@ -169,15 +167,13 @@ The secret is the first line of CONTENTS."
 (defun auth-source-pass--parse-data (contents)
   "Parse the password-store data in the string CONTENTS and return an alist.
 CONTENTS is the contents of a password-store formatted file."
-  (let ((lines (split-string contents "\n" t "[ \t]+")))
+  (let ((lines (cdr (split-string contents "\n" t "[ \t]+"))))
     (seq-remove #'null
                 (mapcar (lambda (line)
-                          (let ((pair (mapcar (lambda (s) (string-trim s))
-                                              (split-string line ":"))))
-                            (when (> (length pair) 1)
-                              (cons (car pair)
-                                    (mapconcat #'identity (cdr pair) ":")))))
-                        (cdr lines)))))
+                          (when-let ((pos (seq-position line ?:)))
+                            (cons (string-trim (substring line 0 pos))
+                                  (string-trim (substring line (1+ pos))))))
+                        lines))))
 
 (defun auth-source-pass--do-debug (&rest msg)
   "Call `auth-source-do-debug` with MSG and a prefix."
@@ -194,12 +190,21 @@ CONTENTS is the contents of a password-store formatted 
file."
      (lambda (file) (file-name-sans-extension (file-relative-name file 
store-dir)))
      (directory-files-recursively store-dir "\\.gpg\\'"))))
 
-(defun auth-source-pass--find-match (host user port)
-  "Return password-store entry data matching HOST, USER and PORT.
-
-Disambiguate between user provided inside HOST (e.g., user@server.com) and
-inside USER by giving priority to USER.  Same for PORT."
-  (apply #'auth-source-pass--find-match-unambiguous 
(auth-source-pass--disambiguate host user port)))
+(defun auth-source-pass--find-match (hosts user port)
+  "Return password-store entry data matching HOSTS, USER and PORT.
+
+Disambiguate between user provided inside HOSTS (e.g., user@server.com) and
+inside USER by giving priority to USER.  Same for PORT.
+HOSTS can be a string or a list of strings."
+  (seq-some (lambda (host)
+              (let ((entry (apply #'auth-source-pass--find-match-unambiguous
+                                   (auth-source-pass--disambiguate host user 
port))))
+                (if (or (null entry) (assoc "host" entry))
+                    entry
+                  (cons (cons "host" host) entry))))
+            (if (listp hosts)
+                hosts
+              (list hosts))))
 
 (defun auth-source-pass--disambiguate (host &optional user port)
   "Return (HOST USER PORT) after disambiguation.
@@ -268,7 +273,7 @@ If ENTRIES is nil, use the result of calling 
`auth-source-pass-entries' instead.
 (defun auth-source-pass--generate-entry-suffixes (hostname user port)
   "Return a list of possible entry path suffixes in the password-store.
 
-Based on the supported pathname patterns for HOSTNAME, USER, &
+Based on the supported filename patterns for HOSTNAME, USER, &
 PORT, return a list of possible suffixes for matching entries in
 the password-store.
 
@@ -316,3 +321,5 @@ then NAME & USER, then NAME & PORT, then just NAME."
 
 (provide 'auth-source-pass)
 ;;; auth-source-pass.el ends here
+
+;; LocalWords:  backend hostname
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 2516b4b..6919738 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -121,12 +121,12 @@ let-binding."
          :initform nil
          :documentation "Internal backend data.")
    (create-function :initarg :create-function
-                    :initform ignore
+                    :initform #'ignore
                     :type function
                     :custom function
                     :documentation "The create function.")
    (search-function :initarg :search-function
-                    :initform ignore
+                    :initform #'ignore
                     :type function
                     :custom function
                     :documentation "The search function.")))
@@ -1270,7 +1270,7 @@ See `auth-source-search' for details on SPEC."
 ;; (auth-source-search :host "nonesuch" :type 'netrc :max 1 :create t 
:create-extra-keys '((A "default A") (B)))
 
 (cl-defun auth-source-netrc-create (&rest spec
-                                    &key backend host port create
+                                    &key backend host port create user
                                     &allow-other-keys)
   (let* ((base-required '(host user port secret))
          ;; we know (because of an assertion in auth-source-search) that the
@@ -1278,6 +1278,7 @@ See `auth-source-search' for details on SPEC."
          (create-extra (if (eq t create) nil create))
          (current-data (car (auth-source-search :max 1
                                                 :host host
+                                                :user user
                                                 :port port)))
          (required (append base-required create-extra))
          (file (oref backend source))
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 6eac528..06ba5d0 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -330,22 +330,53 @@ of the menu's data."
 (defvar mode-line-mode-menu (make-sparse-keymap "Minor Modes") "\
 Menu of mode operations in the mode line.")
 
+(defun bindings--menu-item-string (item)
+  "Return the menu-item string for ITEM, or nil if not a menu-item."
+  (pcase item
+    (`(menu-item ,name . ,_) (eval name t))
+    (`(,(and (pred stringp) name) . ,_) name)))
+
+(defun bindings--sort-menu-keymap (map)
+  "Sort the bindings in MAP in alphabetical order by menu-item string.
+The order of bindings in a keymap matters only when it is used as
+a menu, so this function is not useful for non-menu keymaps."
+  (let ((bindings nil)
+        (prompt (keymap-prompt map)))
+    (while (keymapp map)
+      (setq map (map-keymap
+                 (lambda (key item)
+                   ;; FIXME: Handle char-ranges here?
+                   (push (cons key item) bindings))
+                 map)))
+    ;; Sort the bindings and make a new keymap from them.
+    (setq bindings
+          (sort bindings
+                (lambda (a b)
+                  (string< (bindings--menu-item-string (cdr-safe a))
+                           (bindings--menu-item-string (cdr-safe b))))))
+    (nconc (make-sparse-keymap prompt) bindings)))
+
 (defvar mode-line-major-mode-keymap
   (let ((map (make-sparse-keymap)))
     (bindings--define-key map [mode-line down-mouse-1]
       `(menu-item "Menu Bar" ignore
         :filter ,(lambda (_) (mouse-menu-major-mode-map))))
     (define-key map [mode-line mouse-2] 'describe-mode)
-    (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
+    (bindings--define-key map [mode-line down-mouse-3]
+      `(menu-item "Minor Modes" ,mode-line-mode-menu
+        :filter bindings--sort-menu-keymap))
     map) "\
 Keymap to display on major mode.")
 
 (defvar mode-line-minor-mode-keymap
-  (let ((map (make-sparse-keymap)))
+  (let ((map (make-sparse-keymap))
+        (mode-menu-binding
+         `(menu-item "Menu Bar" ,mode-line-mode-menu
+           :filter bindings--sort-menu-keymap)))
     (define-key map [mode-line down-mouse-1] 'mouse-minor-mode-menu)
     (define-key map [mode-line mouse-2] 'mode-line-minor-mode-help)
-    (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
-    (define-key map [header-line down-mouse-3] mode-line-mode-menu)
+    (define-key map [mode-line down-mouse-3] mode-menu-binding)
+    (define-key map [header-line down-mouse-3] mode-menu-binding)
     map) "\
 Keymap to display on minor modes.")
 
@@ -610,7 +641,9 @@ Switch to the most recently selected buffer other than the 
current one."
     (previous-buffer)))
 
 (defmacro bound-and-true-p (var)
-  "Return the value of symbol VAR if it is bound, else nil."
+  "Return the value of symbol VAR if it is bound, else nil.
+Note that if `lexical-binding' is in effect, this function isn't
+meaningful if it refers to a lexically bound variable."
   `(and (boundp (quote ,var)) ,var))
 
 ;; Use mode-line-mode-menu for local minor-modes only.
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index 98797a0..31e41a9 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -121,6 +121,12 @@ recently set ones come first, oldest ones come last)."
   :type 'boolean)
 
 
+(defcustom bookmark-menu-confirm-deletion nil
+  "Non-nil means confirm before deleting bookmarks in a bookmark menu buffer.
+Nil means don't prompt for confirmation."
+  :version "28.1"
+  :type 'boolean)
+
 (defcustom bookmark-automatically-show-annotations t
   "Non-nil means show annotations when jumping to a bookmark."
   :type 'boolean)
@@ -167,12 +173,34 @@ A non-nil value may result in truncated bookmark names."
   "Time before `bookmark-bmenu-search' updates the display."
   :type  'number)
 
+(defcustom bookmark-fontify t
+  "Whether to colorize a bookmarked line.
+If non-nil, setting a bookmark will colorize the current line with
+`bookmark-face'."
+  :type  'boolean
+  :version "28.1")
+
 ;; FIXME: No longer used.  Should be declared obsolete or removed.
 (defface bookmark-menu-heading
   '((t (:inherit font-lock-type-face)))
   "Face used to highlight the heading in bookmark menu buffers."
   :version "22.1")
 
+(defface bookmark-face
+  '((((class grayscale)
+      (background light))
+     :background "DimGray")
+    (((class grayscale)
+      (background dark))
+     :background "LightGray")
+    (((class color)
+      (background light))
+     :foreground "White" :background "DarkOrange1")
+    (((class color)
+      (background dark))
+     :foreground "Black" :background "DarkOrange1"))
+  "Face used to highlight current line."
+  :version "28.1")
 
 ;;; No user-serviceable parts beyond this point.
 
@@ -427,6 +455,30 @@ In other words, return all information but the name."
 (defvar bookmark-history nil
   "The history list for bookmark functions.")
 
+(defun bookmark--fontify ()
+  "Apply a colorized overlay to the bookmarked location.
+See user option `bookmark-fontify'."
+  (let ((bm (make-overlay (point-at-bol)
+                          (min (point-max) (1+ (point-at-eol))))))
+    (overlay-put bm 'category 'bookmark)
+    (overlay-put bm 'face 'bookmark-face)))
+
+(defun bookmark--unfontify (bm)
+  "Remove a bookmark's colorized overlay.
+BM is a bookmark as returned from function `bookmark-get-bookmark'.
+See user option `bookmark-fontify'."
+  (let ((filename (assq 'filename bm))
+        (pos      (assq 'position bm))
+        overlays found temp)
+    (when filename (setq filename (expand-file-name (cdr filename))))
+    (when pos (setq pos (cdr pos)))
+    (dolist (buf (buffer-list))
+      (with-current-buffer buf
+        (when (equal filename buffer-file-name)
+          (setq overlays (overlays-at pos))
+          (while (and (not found) (setq temp (pop overlays)))
+            (when (eq 'bookmark (overlay-get temp 'category))
+              (delete-overlay (setq found temp)))))))))
 
 (defun bookmark-completing-read (prompt &optional default)
   "Prompting with PROMPT, read a bookmark name in completion.
@@ -825,7 +877,9 @@ still there, in order, if the topmost one is ever deleted."
 
            ;; Ask for an annotation buffer for this bookmark
            (when bookmark-use-annotations
-             (bookmark-edit-annotation str))))
+             (bookmark-edit-annotation str))
+           (when bookmark-fontify
+             (bookmark--fontify))))
     (setq bookmark-yank-point nil)
     (setq bookmark-current-buffer nil)))
 
@@ -1094,6 +1148,14 @@ and then show any annotations for this bookmark."
     (if win (set-window-point win (point))))
   ;; FIXME: we used to only run bookmark-after-jump-hook in
   ;; `bookmark-jump' itself, but in none of the other commands.
+  (when bookmark-fontify
+    (let ((overlays (overlays-at (point)))
+          temp found)
+      (while (and (not found) (setq temp (pop overlays)))
+        (when (eq 'bookmark (overlay-get temp 'category))
+          (setq found t)))
+      (unless found
+        (bookmark--fontify))))
   (run-hooks 'bookmark-after-jump-hook)
   (if bookmark-automatically-show-annotations
       ;; if there is an annotation for this bookmark,
@@ -1357,6 +1419,7 @@ probably because we were called from there."
   (bookmark-maybe-historicize-string bookmark-name)
   (bookmark-maybe-load-default-file)
   (let ((will-go (bookmark-get-bookmark bookmark-name 'noerror)))
+    (bookmark--unfontify will-go)
     (setq bookmark-alist (delq will-go bookmark-alist))
     ;; Added by db, nil bookmark-current-bookmark if the last
     ;; occurrence has been deleted
@@ -1376,6 +1439,13 @@ probably because we were called from there."
 If optional argument NO-CONFIRM is non-nil, don't ask for
 confirmation."
   (interactive "P")
+  ;; We don't use `bookmark-menu-confirm-deletion' here because that
+  ;; variable is specifically to control confirmation prompting in a
+  ;; bookmark menu buffer, where the user has the marked-for-deletion
+  ;; bookmarks arrayed in front of them and might have accidentally
+  ;; hit the key that executes the deletions.  The UI situation here
+  ;; is quite different, by contrast: the user got to this point by a
+  ;; sequence of keystrokes unlikely to be typed by chance.
   (when (or no-confirm
             (yes-or-no-p "Permanently delete all bookmarks? "))
     (bookmark-maybe-load-default-file)
@@ -1984,7 +2054,10 @@ You can mark bookmarks with the 
\\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-mar
 
 (defun bookmark-bmenu-save ()
   "Save the current list into a bookmark file.
-With a prefix arg, prompts for a file to save them in."
+With a prefix arg, prompts for a file to save them in.
+
+See also the related behaviors of `bookmark-load' and
+`bookmark-bmenu-load'."
   (interactive nil bookmark-bmenu-mode)
   (save-excursion
     (save-window-excursion
@@ -1993,7 +2066,19 @@ With a prefix arg, prompts for a file to save them in."
 
 
 (defun bookmark-bmenu-load ()
-  "Load the bookmark file and rebuild the bookmark menu-buffer."
+  "Load bookmarks from a file and rebuild the bookmark menu-buffer.
+Prompt for a file, with the default choice being the value of
+`bookmark-default-file'.
+
+With a prefix argument, replace the current ambient bookmarks
+(i.e., the ones in `bookmark-alist') with the ones from the selected
+file and make that file be the new value of `bookmark-default-file'.
+In other words, a prefix argument means \"switch over to the bookmark
+universe defined in the loaded file\".  Without a prefix argument,
+just add the loaded bookmarks into the current ambient set.
+
+See the documentation for `bookmark-load' for more details; see also
+the related behaviors of `bookmark-save' and `bookmark-bmenu-save'."
   (interactive nil bookmark-bmenu-mode)
   (bookmark-bmenu-ensure-position)
   (save-excursion
@@ -2142,30 +2227,35 @@ To carry out the deletions that you've marked, use 
\\<bookmark-bmenu-mode-map>\\
 
 
 (defun bookmark-bmenu-execute-deletions ()
-  "Delete bookmarks flagged `D'."
+  "Delete bookmarks flagged `D'.
+If `bookmark-menu-confirm-deletion' is non-nil, prompt for
+confirmation first."
   (interactive nil bookmark-bmenu-mode)
-  (let ((reporter (make-progress-reporter "Deleting bookmarks..."))
-        (o-point  (point))
-        (o-str    (save-excursion
-                    (beginning-of-line)
-                    (unless (= (following-char) ?D)
-                      (buffer-substring
-                       (point)
-                       (progn (end-of-line) (point))))))
-        (o-col     (current-column)))
-    (goto-char (point-min))
-    (while (re-search-forward "^D" (point-max) t)
-      (bookmark-delete (bookmark-bmenu-bookmark) t)) ; pass BATCH arg
-    (bookmark-bmenu-list)
-    (if o-str
-        (progn
-          (goto-char (point-min))
-          (search-forward o-str)
-          (beginning-of-line)
-          (forward-char o-col))
-      (goto-char o-point))
-    (beginning-of-line)
-    (progress-reporter-done reporter)))
+  (if (and bookmark-menu-confirm-deletion
+           (not (yes-or-no-p "Delete selected bookmarks? ")))
+      (message "Bookmarks not deleted.")
+    (let ((reporter (make-progress-reporter "Deleting bookmarks..."))
+          (o-point  (point))
+          (o-str    (save-excursion
+                      (beginning-of-line)
+                      (unless (= (following-char) ?D)
+                        (buffer-substring
+                         (point)
+                         (progn (end-of-line) (point))))))
+          (o-col     (current-column)))
+      (goto-char (point-min))
+      (while (re-search-forward "^D" (point-max) t)
+        (bookmark-delete (bookmark-bmenu-bookmark) t)) ; pass BATCH arg
+      (bookmark-bmenu-list)
+      (if o-str
+          (progn
+            (goto-char (point-min))
+            (search-forward o-str)
+            (beginning-of-line)
+            (forward-char o-col))
+        (goto-char o-point))
+      (beginning-of-line)
+      (progress-reporter-done reporter))))
 
 
 (defun bookmark-bmenu-rename ()
diff --git a/lisp/calendar/cal-menu.el b/lisp/calendar/cal-menu.el
index 497f332..ef84bfa 100644
--- a/lisp/calendar/cal-menu.el
+++ b/lisp/calendar/cal-menu.el
@@ -104,9 +104,9 @@
         ;; The bug has since been fixed.
         (dotimes (i 11)
           (push (vector (format "hol-year-%d" i)
-                        `(lambda ()
-                           (interactive)
-                           (holiday-list (+ displayed-year ,(- i 5))))
+                        (lambda ()
+                          (interactive)
+                          (holiday-list (+ displayed-year (- i 5))))
                         :label `(format "For Year %d"
                                        (+ displayed-year ,(- i 5))))
                 l))
diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index 44c4811..f22f060 100644
--- a/lisp/calendar/iso8601.el
+++ b/lisp/calendar/iso8601.el
@@ -231,17 +231,22 @@ See `decode-time' for the meaning of FORM."
                            (string-to-number (match-string 2 time))))
               (second (and (match-string 3 time)
                            (string-to-number (match-string 3 time))))
-             (fraction (and (not (zerop (length (match-string 4 time))))
-                             (string-to-number (match-string 4 time)))))
+              (frac-string (match-string 4 time))
+              fraction fraction-precision)
+          (when frac-string
+            ;; Remove trailing zeroes.
+            (setq frac-string (replace-regexp-in-string "0+\\'" "" 
frac-string))
+            (when (length> frac-string 0)
+              (setq fraction (string-to-number frac-string)
+                    fraction-precision (length frac-string))))
           (when (and fraction
                      (eq form t))
             (cond
              ;; Sub-second time.
              (second
-              (let ((digits (1+ (truncate (log fraction 10)))))
-                (setq second (cons (+ (* second (expt 10 digits))
-                                      fraction)
-                                   (expt 10 digits)))))
+              (setq second (cons (+ (* second (expt 10 fraction-precision))
+                                    fraction)
+                                 (expt 10 fraction-precision))))
              ;; Fractional minute.
              (minute
               (setq second (iso8601--decimalize fraction 60)))
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index 2df57a3..1c169b7 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -525,6 +525,8 @@ changes in daylight saving time are not taken into account."
 (defun decoded-time-set-defaults (time &optional default-zone)
   "Set any nil values in `decoded-time' TIME to default values.
 The default value is based on January 1st, 1970 at midnight.
+This year is used to guarantee portability; see Info
+node `(elisp) Time of Day'.
 
 TIME is modified and returned."
   (unless (decoded-time-second time)
@@ -539,7 +541,7 @@ TIME is modified and returned."
   (unless (decoded-time-month time)
     (setf (decoded-time-month time) 1))
   (unless (decoded-time-year time)
-    (setf (decoded-time-year time) 0))
+    (setf (decoded-time-year time) 1970))
 
   ;; When we don't have a time zone, default to DEFAULT-ZONE without
   ;; DST if DEFAULT-ZONE if given, and to unknown DST otherwise.
diff --git a/lisp/cedet/ede/base.el b/lisp/cedet/ede/base.el
index 3fcc023..103a370 100644
--- a/lisp/cedet/ede/base.el
+++ b/lisp/cedet/ede/base.el
@@ -47,7 +47,7 @@
 ;; and features of those files.
 
 (defclass ede-target (eieio-speedbar-directory-button eieio-named)
-  ((buttonface :initform speedbar-file-face) ;override for superclass
+  ((buttonface :initform 'speedbar-file-face) ;override for superclass
    (name :initarg :name
         :type string
         :custom string
@@ -91,16 +91,16 @@ This is used to match target objects with the compilers 
they can use, and
 which files this object is interested in."
               :accessor ede-object-sourcecode)
    (keybindings :allocation :class
-               :initform (("D" . ede-debug-target))
+               :initform '(("D" . ede-debug-target))
                :documentation
 "Keybindings specialized to this type of target."
                :accessor ede-object-keybindings)
    (menu :allocation :class
-        :initform ( [ "Debug target" ede-debug-target
-                      (ede-buffer-belongs-to-target-p) ]
-                    [ "Run target" ede-run-target
-                      (ede-buffer-belongs-to-target-p) ]
-                    )
+        :initform '( [ "Debug target" ede-debug-target
+                       (ede-buffer-belongs-to-target-p) ]
+                     [ "Run target" ede-run-target
+                       (ede-buffer-belongs-to-target-p) ]
+                     )
         :documentation "Menu specialized to this type of target."
         :accessor ede-object-menu)
    )
@@ -236,7 +236,7 @@ also be of a form used by TRAMP for use with scp, or rcp.")
 This FTP site should be in Emacs form as needed by `ange-ftp'.
 If this slot is nil, then use `ftp-site' instead.")
    (configurations :initarg :configurations
-                  :initform ("debug" "release")
+                  :initform '("debug" "release")
                   :type list
                   :custom (repeat string)
                   :label "Configuration Options"
@@ -258,25 +258,25 @@ and target specific elements such as build variables.")
                    :group (settings)
                    :documentation "Project local variables")
    (keybindings :allocation :class
-               :initform (("D" . ede-debug-target)
-                          ("R" . ede-run-target))
+               :initform '(("D" . ede-debug-target)
+                           ("R" . ede-run-target))
                :documentation "Keybindings specialized to this type of target."
                :accessor ede-object-keybindings)
    (menu :allocation :class
         :initform
-        (
-         [ "Update Version" ede-update-version ede-object ]
-         [ "Version Control Status" ede-vc-project-directory ede-object ]
-         [ "Edit Project Homepage" ede-edit-web-page
-           (and ede-object (oref (ede-toplevel) web-site-file)) ]
-         [ "Browse Project URL" ede-web-browse-home
-           (and ede-object
-                (not (string= "" (oref (ede-toplevel) web-site-url)))) ]
-         "--"
-         [ "Rescan Project Files" ede-rescan-toplevel t ]
-         [ "Edit Projectfile" ede-edit-file-target
-           (ede-buffer-belongs-to-project-p) ]
-         )
+        '(
+          [ "Update Version" ede-update-version ede-object ]
+          [ "Version Control Status" ede-vc-project-directory ede-object ]
+          [ "Edit Project Homepage" ede-edit-web-page
+            (and ede-object (oref (ede-toplevel) web-site-file)) ]
+          [ "Browse Project URL" ede-web-browse-home
+            (and ede-object
+                 (not (string= "" (oref (ede-toplevel) web-site-url)))) ]
+          "--"
+          [ "Rescan Project Files" ede-rescan-toplevel t ]
+          [ "Edit Projectfile" ede-edit-file-target
+            (ede-buffer-belongs-to-project-p) ]
+          )
         :documentation "Menu specialized to this type of target."
         :accessor ede-object-menu)
    )
diff --git a/lisp/cedet/ede/config.el b/lisp/cedet/ede/config.el
index bc1810a..98a0419 100644
--- a/lisp/cedet/ede/config.el
+++ b/lisp/cedet/ede/config.el
@@ -96,7 +96,7 @@ and also want to save some extra level of configuration.")
 This filename excludes the directory name and is used to
 initialize the :file slot of the persistent baseclass.")
    (config-class
-    :initform ede-extra-config
+    :initform 'ede-extra-config
     :allocation :class
     :type class
     :documentation
diff --git a/lisp/cedet/ede/generic.el b/lisp/cedet/ede/generic.el
index b3b59b5..4537f59 100644
--- a/lisp/cedet/ede/generic.el
+++ b/lisp/cedet/ede/generic.el
@@ -137,7 +137,7 @@ subclasses of this base target will override the default 
value.")
                               ede-project-with-config-program
                               ede-project-with-config-c
                               ede-project-with-config-java)
-  ((config-class :initform ede-generic-config)
+  ((config-class :initform 'ede-generic-config)
    (config-file-basename :initform "EDEConfig.el")
    (buildfile :initform ""
              :type string
diff --git a/lisp/cedet/ede/proj-obj.el b/lisp/cedet/ede/proj-obj.el
index 2ae62f4..1b96376 100644
--- a/lisp/cedet/ede/proj-obj.el
+++ b/lisp/cedet/ede/proj-obj.el
@@ -34,8 +34,8 @@
 ;;; Code:
 (defclass ede-proj-target-makefile-objectcode (ede-proj-target-makefile)
   (;; Give this a new default
-   (configuration-variables :initform ("debug" . (("CFLAGS" . "-g")
-                                                 ("LDFLAGS" . "-g"))))
+   (configuration-variables :initform '("debug" . (("CFLAGS" . "-g")
+                                                  ("LDFLAGS" . "-g"))))
    ;; @TODO - add an include path.
    (availablecompilers :initform '(ede-gcc-compiler
                                   ede-g++-compiler
diff --git a/lisp/cedet/ede/proj.el b/lisp/cedet/ede/proj.el
index 6ff7630..c8c34d0 100644
--- a/lisp/cedet/ede/proj.el
+++ b/lisp/cedet/ede/proj.el
@@ -220,7 +220,7 @@ This enables the creation of your target type."
   ((extension :initform ".ede")
    (file-header-line :initform ";; EDE Project Files are auto generated: Do 
Not Edit")
    (makefile-type :initarg :makefile-type
-                 :initform Makefile
+                 :initform 'Makefile
                  :type symbol
                  :custom (choice (const Makefile)
                                  ;(const Makefile.in)
@@ -240,7 +240,7 @@ in targets.")
              :documentation "Variables to set in this Makefile.")
    (configuration-variables
     :initarg :configuration-variables
-    :initform ("debug" (("DEBUG" . "1")))
+    :initform '("debug" (("DEBUG" . "1")))
     :type list
     :custom (repeat (cons (string :tag "Configuration")
                          (repeat
@@ -269,10 +269,10 @@ These files can contain additional rules, variables, and 
customizations.")
     :documentation
     "Non-nil to do implement automatic dependencies in the Makefile.")
    (menu :initform
-        (
-         [ "Regenerate Makefiles" ede-proj-regenerate t ]
-         [ "Upload Distribution" ede-upload-distribution t ]
-         )
+        '(
+          [ "Regenerate Makefiles" ede-proj-regenerate t ]
+          [ "Upload Distribution" ede-upload-distribution t ]
+          )
         )
    (metasubproject
     :initarg :metasubproject
diff --git a/lisp/cedet/pulse.el b/lisp/cedet/pulse.el
index 1e45067..7928fa1 100644
--- a/lisp/cedet/pulse.el
+++ b/lisp/cedet/pulse.el
@@ -120,9 +120,9 @@ Face used for temporary highlighting of tags for effect."
                           (face-background face nil t)
                         (face-background 'pulse-highlight-start-face)
                         ))
-  (and face
-       (set-face-extend 'pulse-highlight-face
-                        (face-extend-p face nil t)))
+  (set-face-extend 'pulse-highlight-face
+                   (face-extend-p (or face 'pulse-highlight-start-face)
+                                  nil t))
   (put 'pulse-highlight-face :startface (or face
                                            'pulse-highlight-start-face))
   (setq pulse-momentary-iteration 0))
@@ -153,8 +153,7 @@ Optional argument FACE specifies the face to do the 
highlighting."
       ;; with a reference face needed for the color.
       (pulse-reset-face face)
       (let* ((start (color-name-to-rgb
-                     (face-background 'pulse-highlight-start-face
-                                      nil 'default)))
+                     (face-background 'pulse-highlight-face nil 'default)))
              (stop (color-name-to-rgb (face-background 'default)))
              (colors (mapcar (apply-partially 'apply 'color-rgb-to-hex)
                              (color-gradient start stop pulse-iterations))))
diff --git a/lisp/cedet/semantic/db-ebrowse.el 
b/lisp/cedet/semantic/db-ebrowse.el
index 682a4cc..8bc3b81 100644
--- a/lisp/cedet/semantic/db-ebrowse.el
+++ b/lisp/cedet/semantic/db-ebrowse.el
@@ -79,7 +79,7 @@ be searched."
 ;;; SEMANTIC Database related Code
 ;;; Classes:
 (defclass semanticdb-table-ebrowse (semanticdb-table)
-  ((major-mode :initform c++-mode)
+  ((major-mode :initform #'c++-mode)
    (ebrowse-tree :initform nil
                 :initarg :ebrowse-tree
                 :documentation
@@ -95,7 +95,7 @@ This table is composited from the ebrowse *Globals* section.")
 
 (defclass semanticdb-project-database-ebrowse
   (semanticdb-project-database)
-  ((new-table-class :initform semanticdb-table-ebrowse
+  ((new-table-class :initform 'semanticdb-table-ebrowse
                    :type class
                    :documentation
                    "New tables created for this database are of this class.")
diff --git a/lisp/cedet/semantic/db-el.el b/lisp/cedet/semantic/db-el.el
index 78339c3..41e48b0 100644
--- a/lisp/cedet/semantic/db-el.el
+++ b/lisp/cedet/semantic/db-el.el
@@ -40,7 +40,7 @@
 
 ;;; Classes:
 (defclass semanticdb-table-emacs-lisp (semanticdb-abstract-table)
-  ((major-mode :initform emacs-lisp-mode)
+  ((major-mode :initform #'emacs-lisp-mode)
    )
   "A table for returning search results from Emacs.")
 
@@ -63,7 +63,7 @@ It does not need refreshing."
 
 (defclass semanticdb-project-database-emacs-lisp
   (semanticdb-project-database eieio-singleton)
-  ((new-table-class :initform semanticdb-table-emacs-lisp
+  ((new-table-class :initform 'semanticdb-table-emacs-lisp
                    :type class
                    :documentation
                    "New tables created for this database are of this class.")
diff --git a/lisp/cedet/semantic/db-javascript.el 
b/lisp/cedet/semantic/db-javascript.el
index cad561e..bf3d612 100644
--- a/lisp/cedet/semantic/db-javascript.el
+++ b/lisp/cedet/semantic/db-javascript.el
@@ -80,7 +80,7 @@ See bottom of this file for instructions on managing this 
list.")
 
 ;;; Classes:
 (defclass semanticdb-table-javascript (semanticdb-search-results-table)
-  ((major-mode :initform javascript-mode)
+  ((major-mode :initform #'javascript-mode)
    )
   "A table for returning search results from javascript.")
 
@@ -88,7 +88,7 @@ See bottom of this file for instructions on managing this 
list.")
   (semanticdb-project-database
    eieio-singleton ;this db is for js globals, so singleton is appropriate
    )
-  ((new-table-class :initform semanticdb-table-javascript
+  ((new-table-class :initform 'semanticdb-table-javascript
                    :type class
                    :documentation
                    "New tables created for this database are of this class.")
diff --git a/lisp/cedet/semantic/db.el b/lisp/cedet/semantic/db.el
index 8f9ecee..38e2b34 100644
--- a/lisp/cedet/semantic/db.el
+++ b/lisp/cedet/semantic/db.el
@@ -321,12 +321,12 @@ Adds the number of tags in this file to the object print 
name."
   '(list-of semanticdb-abstract-table))
 
 (defclass semanticdb-project-database (eieio-instance-tracker)
-  ((tracking-symbol :initform semanticdb-database-list)
+  ((tracking-symbol :initform 'semanticdb-database-list)
    (reference-directory :type string
                        :documentation "Directory this database refers to.
 When a cache directory is specified, then this refers to the directory
 this database contains symbols for.")
-   (new-table-class :initform semanticdb-table
+   (new-table-class :initform 'semanticdb-table
                    :type class
                    :documentation
                    "New tables created for this database are of this class.")
diff --git a/lisp/cedet/semantic/ede-grammar.el 
b/lisp/cedet/semantic/ede-grammar.el
index 6bb8352..19d4184 100644
--- a/lisp/cedet/semantic/ede-grammar.el
+++ b/lisp/cedet/semantic/ede-grammar.el
@@ -38,13 +38,13 @@
    (keybindings :initform nil)
    (phony :initform t)
    (sourcetype :initform
-              (semantic-ede-source-grammar-wisent
-               semantic-ede-source-grammar-bovine
-               ))
+              '(semantic-ede-source-grammar-wisent
+                semantic-ede-source-grammar-bovine
+                ))
    (availablecompilers :initform
-                      (semantic-ede-grammar-compiler-wisent
-                       semantic-ede-grammar-compiler-bovine
-                       ))
+                      '(semantic-ede-grammar-compiler-wisent
+                        semantic-ede-grammar-compiler-bovine
+                        ))
    (aux-packages :initform '("semantic" "cedet-compat"))
    (pre-load-packages :initform '("cedet-compat" "semantic/grammar" 
"semantic/bovine/grammar" "semantic/wisent/grammar"))
    )
diff --git a/lisp/cedet/semantic/grm-wy-boot.el 
b/lisp/cedet/semantic/grm-wy-boot.el
index b301403..a6bf211 100644
--- a/lisp/cedet/semantic/grm-wy-boot.el
+++ b/lisp/cedet/semantic/grm-wy-boot.el
@@ -436,12 +436,6 @@
 
 ;;; Analyzers
 ;;
-(define-lex-regex-type-analyzer semantic-grammar-wy--<symbol>-regexp-analyzer
-  "regexp analyzer for <symbol> tokens."
-  ":?\\(\\sw\\|\\s_\\)+"
-  '((PERCENT_PERCENT . "\\`%%\\'"))
-  'SYMBOL)
-
 (define-lex-keyword-type-analyzer 
semantic-grammar-wy--<keyword>-keyword-analyzer
   "keyword analyzer for <keyword> tokens."
   "\\(\\sw\\|\\s_\\)+")
@@ -452,10 +446,10 @@
   nil
   'CHARACTER)
 
-(define-lex-sexp-type-analyzer semantic-grammar-wy--<qlist>-sexp-analyzer
-  "sexp analyzer for <qlist> tokens."
-  "\\s'\\s-*("
-  'PREFIXED_LIST)
+(define-lex-sexp-type-analyzer semantic-grammar-wy--<string>-sexp-analyzer
+  "sexp analyzer for <string> tokens."
+  "\\s\""
+  'STRING)
 
 (define-lex-block-type-analyzer semantic-grammar-wy--<block>-block-analyzer
   "block analyzer for <block> tokens."
@@ -476,10 +470,16 @@
     (COLON . ":"))
   'punctuation)
 
-(define-lex-sexp-type-analyzer semantic-grammar-wy--<string>-sexp-analyzer
-  "sexp analyzer for <string> tokens."
-  "\\s\""
-  'STRING)
+(define-lex-regex-type-analyzer semantic-grammar-wy--<symbol>-regexp-analyzer
+  "regexp analyzer for <symbol> tokens."
+  ":?\\(\\sw\\|\\s_\\)+"
+  '((PERCENT_PERCENT . "\\`%%\\'"))
+  'SYMBOL)
+
+(define-lex-sexp-type-analyzer semantic-grammar-wy--<qlist>-sexp-analyzer
+  "sexp analyzer for <qlist> tokens."
+  "\\s'\\s-*("
+  'PREFIXED_LIST)
 
 (define-lex-sexp-type-analyzer semantic-grammar-wy--<sexp>-sexp-analyzer
   "sexp analyzer for <sexp> tokens."
diff --git a/lisp/cedet/semantic/symref/grep.el 
b/lisp/cedet/semantic/symref/grep.el
index 46027f1..180d779 100644
--- a/lisp/cedet/semantic/symref/grep.el
+++ b/lisp/cedet/semantic/symref/grep.el
@@ -168,7 +168,7 @@ This shell should support pipe redirect syntax."
       (erase-buffer)
       (setq default-directory rootdir)
       (let ((cmd (semantic-symref-grep-use-template
-                  (file-name-as-directory (file-local-name rootdir))
+                  (directory-file-name (file-local-name rootdir))
                   filepattern grepflags greppat)))
         (process-file semantic-symref-grep-shell nil b nil
                       shell-command-switch cmd)))
diff --git a/lisp/cedet/srecode/compile.el b/lisp/cedet/srecode/compile.el
index 36df1da..15107ef 100644
--- a/lisp/cedet/srecode/compile.el
+++ b/lisp/cedet/srecode/compile.el
@@ -110,7 +110,12 @@ stack is broken."
               :type (or null string)
               :documentation
               "If there is a colon in the inserter's name, it represents
-additional static argument data."))
+additional static argument data.")
+   (key :initform nil :allocation :class
+        :documentation
+        "The character code used to identify inserters of this style.
+All children of this class should specify `key' slot with appropriate
+:initform value."))
   "This represents an item to be inserted via a template macro.
 Plain text strings are not handled via this baseclass."
   :abstract t)
diff --git a/lisp/cedet/srecode/insert.el b/lisp/cedet/srecode/insert.el
index ab0503c..f20842b 100644
--- a/lisp/cedet/srecode/insert.el
+++ b/lisp/cedet/srecode/insert.el
@@ -89,6 +89,8 @@ DICT-ENTRIES are additional dictionary values to add."
     ;; for this insertion step.
     ))
 
+(eieio-declare-slots (point :allocation :class))
+
 (defun srecode-insert-fcn (template dictionary &optional stream skipresolver)
   "Insert TEMPLATE using DICTIONARY into STREAM.
 Optional SKIPRESOLVER means to avoid refreshing the tag list,
@@ -134,13 +136,13 @@ has set everything up already."
          )
       (srecode-insert-method template dictionary))
     ;; Handle specialization of the POINT inserter.
-    (when (and (bufferp standard-output)
-              (slot-boundp 'srecode-template-inserter-point 'point)
-              )
-      (set-buffer standard-output)
-      (setq end-mark (point-marker))
-      (goto-char  (oref-default 'srecode-template-inserter-point point)))
-    (oset-default 'srecode-template-inserter-point point eieio-unbound)
+    (when (bufferp standard-output)
+      (let ((point (oref-default 'srecode-template-inserter-point point)))
+        (when point
+          (set-buffer standard-output)
+          (setq end-mark (point-marker))
+          (goto-char point))))
+    (oset-default 'srecode-template-inserter-point point nil)
 
     ;; Return the end-mark.
     (or end-mark (point)))
@@ -733,6 +735,7 @@ DEPTH.")
        "The character code used to identify inserters of this style.")
    (point :type (or null marker)
          :allocation :class
+         :initform nil
          :documentation
          "Record the value of (point) in this class slot.
 It is the responsibility of the inserter algorithm to clear this
diff --git a/lisp/comint.el b/lisp/comint.el
index ef34174..9e40661 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -54,7 +54,7 @@
 ;; instead of shell-mode, see the notes at the end of this file.
 
 
-;; Brief Command Documentation:
+;;; Brief Command Documentation:
 ;;============================================================================
 ;; Comint Mode Commands: (common to all derived modes, like shell & cmulisp
 ;; mode)
@@ -106,7 +106,7 @@
 (require 'regexp-opt)                   ;For regexp-opt-charset.
 (eval-when-compile (require 'subr-x))
 
-;; Buffer Local Variables:
+;;; Buffer Local Variables:
 ;;============================================================================
 ;; Comint mode buffer local variables:
 ;;  comint-prompt-regexp               string  comint-bol uses to match prompt
@@ -150,10 +150,10 @@
   :group 'comint)
 
 ;; Unused.
-;;; (defgroup comint-source nil
-;;;   "Source finding facilities in comint."
-;;;   :prefix "comint-"
-;;;   :group 'comint)
+;; (defgroup comint-source nil
+;;   "Source finding facilities in comint."
+;;   :prefix "comint-"
+;;   :group 'comint)
 
 (defvar comint-prompt-regexp "^"
   "Regexp to recognize prompts in the inferior process.
@@ -924,8 +924,8 @@ by the global keymap (usually `mouse-yank-at-click')."
         ;; Insert the input at point
         (insert input)))))
 
-;; Input history processing in a buffer
-;; ===========================================================================
+;;; Input history processing in a buffer
+;;============================================================================
 ;; Useful input history functions, courtesy of the Ergo group.
 
 ;; Eleven commands:
@@ -2847,7 +2847,7 @@ updated using `comint-update-fence', if necessary."
          (kill-region beg end)
          (comint-update-fence))))))
 
-;; Support for source-file processing commands.
+;;; Support for source-file processing commands.
 ;;============================================================================
 ;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have
 ;; commands that process files of source text (e.g. loading or compiling
@@ -2981,8 +2981,8 @@ A typical use:
 ;;     -Olin
 
 
-;; Simple process query facility.
-;; ===========================================================================
+;;; Simple process query facility.
+;;============================================================================
 ;; This function is for commands that want to send a query to the process
 ;; and show the response to the user. For example, a command to get the
 ;; arglist for a Common Lisp function might send a "(arglist 'foo)" query
@@ -3018,8 +3018,8 @@ its response can be seen."
            (set-window-point proc-win opoint)))))))
 
 
-;; Filename/command/history completion in a buffer
-;; ===========================================================================
+;;; Filename/command/history completion in a buffer
+;;============================================================================
 ;; Useful completion functions, courtesy of the Ergo group.
 
 ;; Six commands:
@@ -3883,8 +3883,8 @@ REGEXP-GROUP is the regular expression group in REGEXP to 
use."
          (forward-line 1)))
       (nreverse results))))
 
-;; Converting process modes to use comint mode
-;; ===========================================================================
+;;; Converting process modes to use comint mode
+;;============================================================================
 ;; The code in the Emacs 19 distribution has all been modified to use comint
 ;; where needed.  However, there are `third-party' packages out there that
 ;; still use the old shell mode.  Here's a guide to conversion.
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index b7afef6..3c2625a 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -285,6 +285,7 @@ Leaving \"Default\" unchecked is equivalent with specifying 
a default of
                      (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
                          ;; See bug#7135.
                          (let* (file-name-handler-alist
+                                 (default-directory "/")
                                 (tmp (ignore-errors
                                        (shell-command-to-string
                                         "getconf DARWIN_USER_TEMP_DIR"))))
diff --git a/lisp/cus-theme.el b/lisp/cus-theme.el
index 13fb9f3..f4885d0 100644
--- a/lisp/cus-theme.el
+++ b/lisp/cus-theme.el
@@ -108,60 +108,16 @@ named *Custom Theme*."
     (unless (y-or-n-p "Include basic face customizations in this theme? ")
       (setq custom-theme--listed-faces nil)))
 
-  (if (eq theme 'user)
-      (widget-insert "This buffer contains all the Custom settings you have 
made.
-You can convert them into a new custom theme, and optionally
-remove them from your saved Custom file.\n\n"))
-
-  (widget-create 'push-button
-                :tag " Visit Theme "
-                :help-echo "Insert the settings of a pre-defined theme."
-                :action (lambda (_widget &optional _event)
-                           (call-interactively #'custom-theme-visit-theme)))
-  (widget-insert "  ")
-  (widget-create 'push-button
-                :tag " Merge Theme "
-                :help-echo "Merge in the settings of a pre-defined theme."
-                :action (lambda (_widget &optional _event)
-                           (call-interactively #'custom-theme-merge-theme)))
-  (widget-insert "  ")
-  (widget-create 'push-button
-                :tag " Revert "
-                :help-echo "Revert this buffer to its original state."
-                :action (lambda (&rest ignored) (revert-buffer)))
-
-  (widget-insert "\n\nTheme name : ")
-  (setq custom-theme-name
-       (widget-create 'editable-field
-                      :value (if (and theme (not (eq theme 'user)))
-                                 (symbol-name theme)
-                               "")))
-  (widget-insert "Description: ")
-  (setq custom-theme-description
-       (widget-create 'text
-                      :value (format-time-string "Created %Y-%m-%d.")))
-  (widget-create 'push-button
-                 :notify #'custom-theme-write
-                " Save Theme ")
-  (when (eq theme 'user)
-    (setq custom-theme--migrate-settings t)
-    (widget-insert "  ")
-    (widget-create 'checkbox
-                  :value custom-theme--migrate-settings
-                  :action (lambda (widget &optional event)
-                            (when (widget-value widget)
-                              (widget-toggle-action widget event)
-                              (setq custom-theme--migrate-settings
-                                    (widget-value widget)))))
-    (widget-insert (propertize " Remove saved theme settings from Custom save 
file."
-                              'face '(variable-pitch (:height 0.9)))))
-
   (let (vars values faces face-specs)
 
     ;; Load the theme settings.
     (when theme
-      (unless (eq theme 'user)
-       (load-theme theme nil t))
+      (if (eq theme 'user)
+          (widget-insert "This buffer contains all the Custom settings you 
have made.
+You can convert them into a new custom theme, and optionally
+remove them from your saved Custom file.\n\n")
+        (load-theme theme nil t))
+
       (dolist (setting (get theme 'theme-settings))
        (if (eq (car setting) 'theme-value)
            (progn (push (nth 1 setting) vars)
@@ -169,6 +125,50 @@ remove them from your saved Custom file.\n\n"))
          (push (nth 1 setting) faces)
          (push (nth 3 setting) face-specs))))
 
+    (widget-create 'push-button
+                  :tag " Visit Theme "
+                  :help-echo "Insert the settings of a pre-defined theme."
+                  :action (lambda (_widget &optional _event)
+                             (call-interactively #'custom-theme-visit-theme)))
+    (widget-insert "  ")
+    (widget-create 'push-button
+                  :tag " Merge Theme "
+                  :help-echo "Merge in the settings of a pre-defined theme."
+                  :action (lambda (_widget &optional _event)
+                             (call-interactively #'custom-theme-merge-theme)))
+    (widget-insert "  ")
+    (widget-create 'push-button
+                  :tag " Revert "
+                  :help-echo "Revert this buffer to its original state."
+                  :action (lambda (&rest ignored) (revert-buffer)))
+
+    (widget-insert "\n\nTheme name : ")
+    (setq custom-theme-name
+         (widget-create 'editable-field
+                        :value (if (and theme (not (eq theme 'user)))
+                                   (symbol-name theme)
+                                 "")))
+    (widget-insert "Description: ")
+    (setq custom-theme-description
+          (widget-create 'text :format "%v"
+                         :value (or (get theme 'theme-documentation)
+                                    (format-time-string "Created %Y-%m-%d."))))
+    (widget-create 'push-button
+                   :notify #'custom-theme-write
+                   " Save Theme ")
+    (when (eq theme 'user)
+      (setq custom-theme--migrate-settings t)
+      (widget-insert "  ")
+      (widget-create 'checkbox
+                    :value custom-theme--migrate-settings
+                    :action (lambda (widget &optional event)
+                              (when (widget-value widget)
+                                (widget-toggle-action widget event)
+                                (setq custom-theme--migrate-settings
+                                      (widget-value widget)))))
+      (widget-insert (propertize " Remove saved theme settings from Custom 
save file."
+                                'face '(variable-pitch (:height 0.9)))))
+
     ;; If THEME is non-nil, insert all of that theme's faces.
     ;; Otherwise, insert those in `custom-theme--listed-faces'.
     (widget-insert "\n\n  Theme faces:\n ")
@@ -657,10 +657,12 @@ Theme files are named *-theme.el in `"))
            (insert-file-contents fn)
            (let ((sexp (let ((read-circle nil))
                          (condition-case nil
-                             (read (current-buffer))
-                           (end-of-file nil)))))
-              (and (eq (car-safe sexp) 'deftheme)
-                  (setq doc (nth 2 sexp))))))))
+                              (progn
+                                (re-search-forward "^(deftheme")
+                                (beginning-of-line)
+                                (read (current-buffer)))
+                            (error nil)))))
+              (setq doc (nth 2 sexp)))))))
     (cond ((null doc)
           "(no documentation available)")
          ((string-match ".*" doc)
diff --git a/lisp/custom.el b/lisp/custom.el
index 614f8cf..1db3f4f 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -207,7 +207,22 @@ set to nil, as the value is no longer rogue."
     (put symbol 'custom-requests requests)
     ;; Do the actual initialization.
     (unless custom-dont-initialize
-      (funcall initialize symbol default))
+      (funcall initialize symbol default)
+      ;; If there is a value under saved-value that wasn't saved by the user,
+      ;; reset it: we used that property to stash the value, but we don't need
+      ;; it anymore.
+      ;; This can happen given the following:
+      ;; 1. The user loaded a theme that had a setting for an unbound
+      ;; variable, so we stashed the theme setting under the saved-value
+      ;; property in `custom-theme-recalc-variable'.
+      ;; 2. Then, Emacs evaluated the defcustom for the option
+      ;; (e.g., something required the file where the option is defined).
+      ;; If we don't reset it and the user later sets this variable via
+      ;; Customize, we might end up saving the theme setting in the 
custom-file.
+      ;; See the test `custom-test-no-saved-value-after-customizing-option'.
+      (let ((theme (caar (get symbol 'theme-value))))
+        (when (and theme (not (eq theme 'user)) (get symbol 'saved-value))
+          (put symbol 'saved-value nil))))
     (when buffer-local
       (make-variable-buffer-local symbol)))
   (run-hooks 'custom-define-hook)
@@ -1513,10 +1528,18 @@ See `custom-enabled-themes' for a list of enabled 
themes."
        (let* ((prop   (car s))
               (symbol (cadr s))
               (val (assq-delete-all theme (get symbol prop))))
-          (custom-push-theme prop symbol theme 'reset)
+          (put symbol prop val)
          (cond
           ((eq prop 'theme-value)
-           (custom-theme-recalc-variable symbol))
+            (custom-theme-recalc-variable symbol)
+            ;; We might have to reset the stashed value of the variable, if
+            ;; no other theme is customizing it.  Without this, loading a theme
+            ;; that has a setting for an unbound user option and then disabling
+            ;; it will leave this lingering setting for the option, and if then
+            ;; Emacs evaluates the defcustom the saved-value might be used to
+            ;; set the variable.  (Bug#20766)
+            (unless (get symbol 'theme-value)
+              (put symbol 'saved-value nil)))
           ((eq prop 'theme-face)
            ;; If the face spec specified by this theme is in the
            ;; saved-face property, reset that property.
@@ -1565,8 +1588,16 @@ This function returns nil if no custom theme specifies a 
value for VARIABLE."
 (defun custom-theme-recalc-variable (variable)
   "Set VARIABLE according to currently enabled custom themes."
   (let ((valspec (custom-variable-theme-value variable)))
-    (if valspec
-       (put variable 'saved-value valspec)
+    ;; We used to save VALSPEC under the saved-value property unconditionally,
+    ;; but that is a recipe for trouble because we might end up saving session
+    ;; customizations if the user loads a theme.  (Bug#21355)
+    ;; It's better to only use the saved-value property to stash the value only
+    ;; if we really need to stash it (i.e., VARIABLE is void).
+    (condition-case nil
+        (default-toplevel-value variable) ; See if it doesn't fail.
+      (void-variable (when valspec
+                       (put variable 'saved-value valspec))))
+    (unless valspec
       (setq valspec (get variable 'standard-value)))
     (if (and valspec
             (or (get variable 'force-value)
diff --git a/lisp/delsel.el b/lisp/delsel.el
index 9823203..3c99dd2 100644
--- a/lisp/delsel.el
+++ b/lisp/delsel.el
@@ -84,9 +84,12 @@ information on adapting behavior of commands in Delete 
Selection mode."
 
 (defvar delsel--replace-text-or-position nil)
 
+;;;###autoload
 (defun delete-active-region (&optional killp)
   "Delete the active region.
-If KILLP in not-nil, the active region is killed instead of deleted."
+If KILLP is non-nil, or if called interactively with a prefix argument,
+the active region is killed instead of deleted."
+  (interactive "P")
   (cond
    (killp
     ;; Don't allow `kill-region' to change the value of `this-command'.
@@ -105,7 +108,7 @@ If KILLP in not-nil, the active region is killed instead of 
deleted."
   "Repeat replacing text of highlighted region with typed text.
 Search for the next stretch of text identical to the region last replaced
 by typing text over it and replaces it with the same stretch of text.
-With ARG, repeat that many times.  `C-u' means until end of buffer."
+With ARG, repeat that many times.  `\\[universal-argument]' means until end of 
buffer."
   (interactive "P")
   (let ((old-text (and delete-selection-save-to-register
                        (get-register delete-selection-save-to-register)))
diff --git a/lisp/desktop.el b/lisp/desktop.el
index fb7c6c7..ae8d026 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -731,7 +731,7 @@ if different)."
 
 ;; ----------------------------------------------------------------------------
 (unless noninteractive
-  (add-hook 'kill-emacs-hook #'desktop-kill))
+  (add-hook 'kill-emacs-query-functions #'desktop-kill))
 
 (defun desktop-kill ()
   "If `desktop-save-mode' is non-nil, do what `desktop-save' says to do.
@@ -759,7 +759,8 @@ is nil, ask the user where to save the desktop."
        (unless (yes-or-no-p "Error while saving the desktop.  Ignore? ")
         (signal (car err) (cdr err))))))
   ;; If we own it, we don't anymore.
-  (when (eq (emacs-pid) (desktop-owner)) (desktop-release-lock)))
+  (when (eq (emacs-pid) (desktop-owner)) (desktop-release-lock))
+  t)
 
 ;; ----------------------------------------------------------------------------
 (defun desktop-list* (&rest args)
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 8fe612f..060f3a8 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -33,6 +33,7 @@
 ;; sorting by Sebastian Kremer <sk@thp.uni-koeln.de>.
 ;; Finished up by rms in 1992.
 
+
 ;;; Code:
 
 (require 'cl-lib)
@@ -45,9 +46,8 @@
 Functions that operate recursively can store additional names
 into this list; they also should call `dired-log' to log the errors.")
 
-;;; 15K
-;;;###begin dired-cmd.el
-;; Diffing and compressing
+
+;;; Diffing and compressing
 
 (defconst dired-star-subst-regexp "\\(^\\|[ \t]\\)\\*\\([ \t]\\|$\\)")
 (defconst dired-quark-subst-regexp "\\(^\\|[ \t]\\)\\?\\([ \t]\\|$\\)")
@@ -135,7 +135,7 @@ substituted, and will be passed through normally to the 
shell.
 
 %s
 
-(Press ^ to %s markers below these occurrences.)
+\(Press ^ to %s markers below these occurrences.)
 "
    "`"
    (string (aref command (car char-positions)))
@@ -288,12 +288,12 @@ If this file is a backup, diff it with its original.
 The backup file is the first file given to `diff'.
 With prefix arg, prompt for argument SWITCHES which is options for `diff'."
   (interactive
-    (if current-prefix-arg
-       (list (read-string "Options for diff: "
-                          (if (stringp diff-switches)
-                              diff-switches
-                            (mapconcat #'identity diff-switches " "))))
-      nil))
+   (if current-prefix-arg
+       (list (read-string "Options for diff: "
+                         (if (stringp diff-switches)
+                             diff-switches
+                           (mapconcat #'identity diff-switches " "))))
+     nil))
   (diff-backup (dired-get-filename) switches))
 
 ;;;###autoload
@@ -418,6 +418,7 @@ List has a form of (file-name full-file-name 
(attribute-list))."
              full-file-name
              (file-attributes full-file-name))))
    (directory-files dir)))
+
 
 ;;; Change file attributes
 
@@ -636,7 +637,7 @@ Uses the shell command coming from variables `lpr-command' 
and
     (dired-run-shell-command (dired-shell-stuff-it command file-list nil))))
 
 (defun dired-mark-read-string (prompt initial op-symbol arg files
-                              &optional default-value collection)
+                                     &optional default-value collection)
   "Read args for a Dired marked-files command, prompting with PROMPT.
 Return the user input (a string).
 
@@ -655,8 +656,9 @@ passed as the second arg to `completing-read'."
                     'completing-read
                     (format prompt (dired-mark-prompt arg files))
                     collection nil nil initial nil default-value nil))
+
 
-;;; Cleaning a directory: flagging some backups for deletion.
+;;; Cleaning a directory: flagging some backups for deletion
 
 (defvar dired-file-version-alist)
 
@@ -699,7 +701,8 @@ with a prefix argument."
     (dired-map-dired-file-lines #'dired-trample-file-versions)
     (message "Cleaning numerical backups...done")))
 
-;;; Subroutines of dired-clean-directory.
+
+;;; Subroutines of dired-clean-directory
 
 (defun dired-map-dired-file-lines (fun)
   ;; Perform FUN with point at the end of each non-directory line.
@@ -750,6 +753,7 @@ with a prefix argument."
         (progn (beginning-of-line)
                (delete-char 1)
                (insert dired-del-marker)))))
+
 
 ;;; Shell commands
 
@@ -871,8 +875,8 @@ can be produced by `dired-get-marked-files', for example.
 `dired-guess-shell-alist-default' and
 `dired-guess-shell-alist-user' are consulted when the user is
 prompted for the shell command to use interactively."
-;;Functions dired-run-shell-command and dired-shell-stuff-it do the
-;;actual work and can be redefined for customization.
+  ;; Functions dired-run-shell-command and dired-shell-stuff-it do the
+  ;; actual work and can be redefined for customization.
   (interactive
    (let ((files (dired-get-marked-files t current-prefix-arg nil nil t)))
      (list
@@ -914,13 +918,13 @@ prompted for the shell command to use interactively."
   "Separates marked files in dired shell commands.")
 
 (defun dired-shell-stuff-it (command file-list on-each &optional _raw-arg)
-;; "Make up a shell command line from COMMAND and FILE-LIST.
-;; If ON-EACH is t, COMMAND should be applied to each file, else
-;; simply concat all files and apply COMMAND to this.
-;; FILE-LIST's elements will be quoted for the shell."
-;; Might be redefined for smarter things and could then use RAW-ARG
-;; (coming from interactive P and currently ignored) to decide what to do.
-;; Smart would be a way to access basename or extension of file names.
+  ;; "Make up a shell command line from COMMAND and FILE-LIST.
+  ;; If ON-EACH is t, COMMAND should be applied to each file, else
+  ;; simply concat all files and apply COMMAND to this.
+  ;; FILE-LIST's elements will be quoted for the shell."
+  ;; Might be redefined for smarter things and could then use RAW-ARG
+  ;; (coming from interactive P and currently ignored) to decide what to do.
+  ;; Smart would be a way to access basename or extension of file names.
   (let* ((in-background (string-match "[ \t]*&[ \t]*\\'" command))
         (command (if in-background
                      (substring command 0 (match-beginning 0))
@@ -986,8 +990,8 @@ prompted for the shell command to use interactively."
       (shell-command command)))
   ;; Return nil for sake of nconc in dired-bunch-files.
   nil)
-
 
+
 (defun dired-check-process (msg program &rest arguments)
   "Display MSG while running PROGRAM, and check for output.
 Remaining arguments are strings passed as command arguments to PROGRAM.
@@ -1032,8 +1036,9 @@ Return the result of `process-file' - zero for success."
         (unless (zerop res)
           (pop-to-buffer out-buffer))
         res))))
+
 
-;; Commands that delete or redisplay part of the dired buffer.
+;;; Commands that delete or redisplay part of the dired buffer
 
 (defun dired-kill-line (&optional arg)
   "Kill the current line (not the files).
@@ -1098,10 +1103,8 @@ present.  A FMT of \"\" will suppress the messaging."
            (message (or fmt "Killed %d line%s.") count (dired-plural-s count)))
        count))))
 
-;;;###end dired-cmd.el
 
-;;; 30K
-;;;###begin dired-cp.el
+;;; Compression
 
 (defun dired-compress ()
   ;; Compress or uncompress the current file.
@@ -1132,6 +1135,7 @@ present.  A FMT of \"\" will suppress the messaging."
     ;; Solaris 10 version of tar (obsolete in 2024?).
     ;; Same thing on AIX 7.1 (obsolete 2023?) and 7.2 (obsolete 2022?).
     ("\\.tar\\.gz\\'" "" "gzip -dc %i | tar -xf -")
+    ("\\.tar\\.xz\\'" "" "xz -dc %i | tar -xf -")
     ("\\.tgz\\'" "" "gzip -dc %i | tar -xf -")
     ("\\.gz\\'" "" "gunzip")
     ("\\.lz\\'" "" "lzip -d")
@@ -1149,10 +1153,7 @@ present.  A FMT of \"\" will suppress the messaging."
     ("\\.zst\\'" "" "unzstd --rm")
     ("\\.7z\\'" "" "7z x -aoa -o%o %i")
     ;; This item controls naming for compression.
-    ("\\.tar\\'" ".tgz" nil)
-    ;; This item controls the compression of directories.  Its REGEXP
-    ;; element should never match any valid file name.
-    ("\000" ".tar.gz" "tar -cf - %i | gzip -c9 > %o"))
+    ("\\.tar\\'" ".tgz" nil))
   "Control changes in file name suffixes for compression and uncompression.
 Each element specifies one transformation rule, and has the form:
   (REGEXP NEW-SUFFIX PROGRAM)
@@ -1168,6 +1169,34 @@ output file.
 Otherwise, the rule is a compression rule, and compression is done with gzip.
 ARGS are command switches passed to PROGRAM.")
 
+(defcustom dired-compress-file-default-suffix nil
+  "Default suffix for compressing a single file.
+If nil, \".gz\" will be used."
+  :type '(choice (const :tag ".gz" nil) string)
+  :group 'dired
+  :version "28.1")
+
+(defvar dired-compress-file-alist
+  '(("\\.gz\\'" . "gzip -9f %i")
+    ("\\.bz2\\'" . "bzip2 -9f %i")
+    ("\\.xz\\'" . "xz -9f %i")
+    ("\\.zst\\'" . "zstd -qf -19 --rm -o %o %i"))
+  "Controls the compression shell command for `dired-do-compress-to'.
+
+Each element is (REGEXP . CMD), where REGEXP is the name of the
+archive to which you want to compress, and CMD is the
+corresponding command.
+
+Within CMD, %i denotes the input file(s), and %o denotes the
+output file.  %i path(s) are relative, while %o is absolute.")
+
+(defcustom dired-compress-directory-default-suffix nil
+  "Default suffix for compressing a directory.
+If nil, \".tar.gz\" will be used."
+  :type '(choice (const :tag ".tar.gz" nil) string)
+  :group 'dired
+  :version "28.1")
+
 (defvar dired-compress-files-alist
   '(("\\.tar\\.gz\\'" . "tar -cf - %i | gzip -c9 > %o")
     ("\\.tar\\.bz2\\'" . "tar -cf - %i | bzip2 -c9 > %o")
@@ -1177,7 +1206,7 @@ ARGS are command switches passed to PROGRAM.")
     ("\\.tar\\.lzo\\'" . "tar -cf - %i | lzop -c9 > %o")
     ("\\.zip\\'" . "zip %o -r --filesync %i")
     ("\\.pax\\'" . "pax -wf %o %i"))
-  "Control the compression shell command for `dired-do-compress-to'.
+  "Controls the compression shell command for `dired-do-compress-to'.
 
 Each element is (REGEXP . CMD), where REGEXP is the name of the
 archive to which you want to compress, and CMD is the
@@ -1275,37 +1304,62 @@ Return nil if no change in files."
            ;; Try gzip; if we don't have that, use compress.
            (condition-case nil
                (if (file-directory-p file)
-                   (progn
-                     (setq suffix (cdr (assoc "\000" 
dired-compress-file-suffixes)))
-                     (when suffix
-                       (let ((out-name (concat file (car suffix)))
-                             (default-directory (file-name-directory file)))
-                         (dired-shell-command
-                          (replace-regexp-in-string
-                           "%o" (shell-quote-argument out-name)
+                   (let* ((suffix
+                           (or dired-compress-directory-default-suffix
+                               ".tar.gz"))
+                          (rule (cl-find-if
+                                 (lambda (x) (string-match-p (car x) suffix))
+                                 dired-compress-files-alist)))
+                     (if rule
+                         (let ((out-name (concat file suffix))
+                               (default-directory (file-name-directory file)))
+                           (dired-shell-command
+                            (replace-regexp-in-string
+                             "%o" (shell-quote-argument out-name)
+                             (replace-regexp-in-string
+                              "%i" (shell-quote-argument
+                                    (file-name-nondirectory file))
+                              (cdr rule)
+                              nil t)
+                             nil t))
+                           out-name)
+                       (user-error
+                        "No compression rule found for \
+`dired-compress-directory-default-suffix' %s, see `dired-compress-files-alist' 
for\
+ the supported suffixes list."
+                        dired-compress-directory-default-suffix)))
+                 (let* ((suffix (or dired-compress-file-default-suffix ".gz"))
+                        (out-name (concat file suffix))
+                        (rule (cl-find-if
+                               (lambda (x) (string-match-p (car x) suffix))
+                               dired-compress-file-alist)))
+                   (if (not rule)
+                       (user-error "No compression rule found for suffix %s, \
+see `dired-compress-file-alist' for the supported suffixes list."
+                                   dired-compress-file-default-suffix)
+                     (and (file-exists-p file)
+                          (or (not (file-exists-p out-name))
+                              (y-or-n-p
+                               (format
+                                "File %s already exists.  Really compress? "
+                                out-name)))
+                          (dired-shell-command
                            (replace-regexp-in-string
-                            "%i" (shell-quote-argument (file-name-nondirectory 
file))
-                            (cadr suffix)
-                            nil t)
-                           nil t))
-                         out-name)))
-                 (let ((out-name (concat file ".gz")))
-                   (and (or (not (file-exists-p out-name))
-                            (y-or-n-p
-                             (format "File %s already exists.  Really 
compress? "
-                                     out-name)))
-                        (not
-                         (dired-check-process (concat "Compressing " file)
-                                              "gzip" "-f" file))
-                        (or (file-exists-p out-name)
-                            (setq out-name (concat file ".z")))
-                        ;; Rename the compressed file to NEWNAME
-                        ;; if it hasn't got that name already.
-                        (if (and newname (not (equal newname out-name)))
-                            (progn
-                              (rename-file out-name newname t)
-                              newname)
-                          out-name))))
+                            "%o" (shell-quote-argument out-name)
+                            (replace-regexp-in-string
+                             "%i" (shell-quote-argument file)
+                             (cdr rule)
+                             nil t)
+                            nil t))
+                          (or (file-exists-p out-name)
+                              (setq out-name (concat file ".z")))
+                          ;; Rename the compressed file to NEWNAME
+                          ;; if it hasn't got that name already.
+                          (if (and newname (not (equal newname out-name)))
+                              (progn
+                                (rename-file out-name newname t)
+                                newname)
+                            out-name)))))
              (file-error
               (if (not (dired-check-process (concat "Compressing " file)
                                             "compress" "-f" file))
@@ -1331,19 +1385,19 @@ Return nil if no change in files."
                                   (dired-mark-prompt arg files) "? ")))))
 
 (defun dired-map-over-marks-check (fun arg op-symbol &optional show-progress)
-;  "Map FUN over marked files (with second ARG like in dired-map-over-marks)
-; and display failures.
+  ;;  "Map FUN over marked files (with second ARG like in dired-map-over-marks)
+  ;; and display failures.
 
-; FUN takes zero args.  It returns non-nil (the offending object, e.g.
-; the short form of the filename) for a failure and probably logs a
-; detailed error explanation using function `dired-log'.
+  ;; FUN takes zero args.  It returns non-nil (the offending object, e.g.
+  ;; the short form of the filename) for a failure and probably logs a
+  ;; detailed error explanation using function `dired-log'.
 
-; OP-SYMBOL is a symbol describing the operation performed (e.g.
-; `compress').  It is used with `dired-mark-pop-up' to prompt the user
-; (e.g. with `Compress * [2 files]? ') and to display errors (e.g.
-; `Failed to compress 1 of 2 files - type W to see why ("foo")')
+  ;; OP-SYMBOL is a symbol describing the operation performed (e.g.
+  ;; `compress').  It is used with `dired-mark-pop-up' to prompt the user
+  ;; (e.g. with `Compress * [2 files]? ') and to display errors (e.g.
+  ;; `Failed to compress 1 of 2 files - type W to see why ("foo")')
 
-; SHOW-PROGRESS if non-nil means redisplay dired after each file."
+  ;; SHOW-PROGRESS if non-nil means redisplay dired after each file."
   (if (dired-mark-confirm op-symbol arg)
       (let* ((total-list;; all of FUN's return values
              (dired-map-over-marks (funcall fun) arg show-progress))
@@ -1403,7 +1457,8 @@ uncompress and unpack all the files in the archive."
   (interactive "P")
   (dired-map-over-marks-check #'dired-compress arg 'compress t))
 
-;; Commands for Emacs Lisp files - load and byte compile
+
+;;; Commands for Emacs Lisp files - load and byte compile
 
 (defun dired-byte-compile ()
   ;; Return nil for success, offending file name else.
@@ -1435,7 +1490,7 @@ uncompress and unpack all the files in the archive."
   ;; Return nil for success, offending file name else.
   (let ((file (dired-get-filename)) failure)
     (condition-case err
-      (load file nil nil t)
+        (load file nil nil t)
       (error (setq failure err)))
     (if (not failure)
        nil
@@ -1495,6 +1550,7 @@ See Info node `(emacs)Subdir switches' for more details."
   (interactive)
   (setq dired-switches-alist nil)
   (revert-buffer))
+
 
 (defun dired-update-file-line (file)
   ;; Delete the current line, and insert an entry for FILE.
@@ -1649,7 +1705,7 @@ files matching `dired-omit-regexp'."
     (forward-line 1)
     (while (and (not (eolp))           ; don't cross subdir boundary
                (not (dired-move-to-filename)))
-       (forward-line 1))
+      (forward-line 1))
     (point)))
 
 ;;;###autoload
@@ -1683,6 +1739,7 @@ See `dired-delete-file' in case you wish that."
                          (line-beginning-position 2)))
       (setq file (directory-file-name file))
       (dired-add-entry file (if (eq ?\s marker) nil marker)))))
+
 
 ;;; Copy, move/rename, making hard and symbolic links
 
@@ -1808,7 +1865,7 @@ unless OK-IF-ALREADY-EXISTS is non-nil."
     (while blist
       (with-current-buffer (car blist)
        (if (and buffer-file-name
-                (dired-in-this-tree-p buffer-file-name expanded-from-dir))
+                (file-in-directory-p buffer-file-name expanded-from-dir))
            (let ((modflag (buffer-modified-p))
                  (to-file (replace-regexp-in-string
                            (concat "^" (regexp-quote from-dir))
@@ -1827,7 +1884,7 @@ unless OK-IF-ALREADY-EXISTS is non-nil."
     (while alist
       (setq elt (car alist)
            alist (cdr alist))
-      (if (dired-in-this-tree-p (car elt) expanded-dir)
+      (if (file-in-directory-p (car elt) expanded-dir)
          ;; ELT's subdir is affected by the rename
          (dired-rename-subdir-2 elt dir to)))
     (if (equal dir default-directory)
@@ -1882,7 +1939,9 @@ unless OK-IF-ALREADY-EXISTS is non-nil."
 (defvar overwrite-query)
 (defvar overwrite-backup-query)
 
-;; The basic function for half a dozen variations on cp/mv/ln/ln -s.
+
+;;; The basic function for half a dozen variations on cp/mv/ln/ln -s
+
 (defun dired-create-files (file-creator operation fn-list name-constructor
                                        &optional marker-char)
   "Create one or more new files from a list of existing files FN-LIST.
@@ -1912,6 +1971,9 @@ or with the current marker character if MARKER-CHAR is t."
     (let (to overwrite-query
             overwrite-backup-query)    ; for dired-handle-overwrite
       (dolist (from fn-list)
+        ;; Position point on the current file -- this is useful if
+        ;; handling a number of files to show where we're working at.
+        (dired-goto-file from)
         (setq to (funcall name-constructor from))
         (if (equal to from)
             (progn
@@ -1962,6 +2024,11 @@ ESC or `q' to not overwrite any of the remaining files,
                   (file-in-directory-p destname from)
                   (error "Cannot copy `%s' into its subdirectory `%s'"
                          from to)))
+            ;; Check, that `dired-do-symlink' does not create symlinks
+            ;; on different hosts.
+            (when (and (eq file-creator 'make-symbolic-link)
+                       (not (equal (file-remote-p from) (file-remote-p to))))
+             (error "Cannot symlink `%s' to `%s' on another host" from to))
             (condition-case err
                 (progn
                   (funcall file-creator from to dired-overwrite-confirmed)
@@ -2008,7 +2075,27 @@ ESC or `q' to not overwrite any of the remaining files,
                         success-count)
               operation success-count))))
   (dired-move-to-filename))
+
 
+(defcustom dired-do-revert-buffer nil
+  "Automatically revert Dired buffers after `dired-do' operations.
+This option controls whether to refresh the directory listing in a
+Dired buffer that is the destination of one of these operations:
+`dired-do-copy', `dired-do-rename', `dired-do-symlink', `dired-do-hardlink'.
+If the value is t, always revert the Dired buffer updated in the result
+of these operations.
+If the value is a function, it is called with the destination directory name
+as a single argument, and the buffer is reverted after Dired operations
+if the function returns non-nil."
+  :type '(choice
+          (const :tag "Don't revert" nil)
+          (const :tag "Always revert destination directory" t)
+          (const :tag "Revert only local Dired buffers"
+                 (lambda (dir) (not (file-remote-p dir))))
+          (function :tag "Predicate function"))
+  :group 'dired
+  :version "28.1")
+
 (defun dired-do-create-files (op-symbol file-creator operation arg
                                        &optional marker-char op1
                                        how-to)
@@ -2104,15 +2191,21 @@ Optional arg HOW-TO determines how to treat the target.
           (error "%s: Target directory does not exist: %s" operation target))
       ;; rename-file bombs when moving directories unless we do this:
       (or into-dir (setq target (directory-file-name target)))
-      (dired-create-files
-       file-creator operation fn-list
-       (if into-dir                    ; target is a directory
-          ;; This function uses fluid variable target when called
-          ;; inside dired-create-files:
-          (lambda (from)
-            (expand-file-name (file-name-nondirectory from) target))
-        (lambda (_from) target))
-       marker-char))))
+      (prog1
+          (dired-create-files
+           file-creator operation fn-list
+           (if into-dir                        ; target is a directory
+              ;; This function uses fluid variable target when called
+              ;; inside dired-create-files:
+              (lambda (from)
+                (expand-file-name (file-name-nondirectory from) target))
+            (lambda (_from) target))
+           marker-char)
+        (when (or (eq dired-do-revert-buffer t)
+                  (and (functionp dired-do-revert-buffer)
+                       (funcall dired-do-revert-buffer target)))
+          (dired-fun-in-all-buffers (file-name-directory target) nil
+                                    #'revert-buffer))))))
 
 ;; Read arguments for a marked-files command that wants a file name,
 ;; perhaps popping up the list of marked files.
@@ -2215,7 +2308,6 @@ Optional arg HOW-TO determines how to treat the target.
       dired-dirs)))
 
 
-
 ;; We use this function in `dired-create-directory' and
 ;; `dired-create-empty-file'; the return value is the new entry
 ;; in the updated Dired buffer.
@@ -2331,7 +2423,7 @@ suggested for the target directory depends on the value of
 For relative symlinks, use \\[dired-do-relsymlink]."
   (interactive "P")
   (dired-do-create-files 'symlink #'make-symbolic-link
-                          "Symlink" arg dired-keep-marker-symlink))
+                         "Symlink" arg dired-keep-marker-symlink))
 
 ;;;###autoload
 (defun dired-do-hardlink (&optional arg)
@@ -2344,7 +2436,7 @@ suggested for the target directory depends on the value of
 `dired-dwim-target', which see."
   (interactive "P")
   (dired-do-create-files 'hardlink #'dired-hardlink
-                          "Hardlink" arg dired-keep-marker-hardlink))
+                         "Hardlink" arg dired-keep-marker-hardlink))
 
 (defun dired-hardlink (file newname &optional ok-if-already-exists)
   (dired-handle-overwrite newname)
@@ -2364,14 +2456,14 @@ of `dired-dwim-target', which see."
   (interactive "P")
   (dired-do-create-files 'move #'dired-rename-file
                         "Move" arg dired-keep-marker-rename "Rename"))
-;;;###end dired-cp.el
+
 
-;;; 5K
-;;;###begin dired-re.el
+;;; Operate on files matched by regexp
+
 (defvar rename-regexp-query)
 
 (defun dired-do-create-files-regexp
-  (file-creator operation arg regexp newname &optional whole-name marker-char)
+    (file-creator operation arg regexp newname &optional whole-name 
marker-char)
   ;; Create a new file for each marked file using regexps.
   ;; FILE-CREATOR and OPERATION as in dired-create-files.
   ;; ARG as in dired-get-marked-files.
@@ -2488,10 +2580,13 @@ See function `dired-do-rename-regexp' for more info."
    #'make-symbolic-link
    "SymLink" arg regexp newname whole-name dired-keep-marker-symlink))
 
+
+;;; Change case of file names
+
 (defvar rename-non-directory-query)
 
 (defun dired-create-files-non-directory
-  (file-creator basename-constructor operation arg)
+    (file-creator basename-constructor operation arg)
   ;; Perform FILE-CREATOR on the non-directory part of marked files
   ;; using function BASENAME-CONSTRUCTOR, with query for each file.
   ;; OPERATION like in dired-create-files, ARG as in dired-get-marked-files.
@@ -2533,10 +2628,8 @@ Type SPC or `y' to %s one file, DEL or `n' to skip to 
next,
   (interactive "P")
   (dired-rename-non-directory #'downcase "Rename downcase" arg))
 
-;;;###end dired-re.el
 
-;;; 13K
-;;;###begin dired-ins.el
+;;; Insert subdirectory
 
 ;;;###autoload
 (defun dired-maybe-insert-subdir (dirname &optional
@@ -2623,7 +2716,7 @@ This function takes some pains to conform to `ls -lR' 
output."
       (setq switches (string-replace "R" "" switches))
       (dolist (cur-ass dired-subdir-alist)
        (let ((cur-dir (car cur-ass)))
-         (and (dired-in-this-tree-p cur-dir dirname)
+         (and (file-in-directory-p cur-dir dirname)
               (let ((cur-cons (assoc-string cur-dir dired-switches-alist)))
                 (if cur-cons
                     (setcdr cur-cons switches)
@@ -2635,7 +2728,7 @@ This function takes some pains to conform to `ls -lR' 
output."
 (defun dired-insert-subdir-validate (dirname &optional switches)
   ;; Check that it is valid to insert DIRNAME with SWITCHES.
   ;; Signal an error if invalid (e.g. user typed `i' on `..').
-  (or (dired-in-this-tree-p dirname (expand-file-name default-directory))
+  (or (file-in-directory-p dirname (expand-file-name default-directory))
       (error  "%s: not in this directory tree" dirname))
   (let ((real-switches (or switches dired-subdir-switches)))
     (when real-switches
@@ -2676,7 +2769,7 @@ of marked files.  If KILL-ROOT is non-nil, kill DIRNAME 
as well."
       (setq dir (car (car s-alist))
            s-alist (cdr s-alist))
       (and (or kill-root (not (string-equal dir dirname)))
-          (dired-in-this-tree-p dir dirname)
+          (file-in-directory-p dir dirname)
           (dired-goto-subdir dir)
           (setq m-alist (nconc (dired-kill-subdir remember-marks) m-alist))))
     m-alist))
@@ -2810,8 +2903,9 @@ is always equal to STRING."
        (setq result
              (cons (substring str end) result)))
     (nreverse result)))
+
 
-;;; moving by subdirectories
+;;; Moving by subdirectories
 
 ;;;###autoload
 (defun dired-prev-subdir (arg &optional no-error-if-not-found no-skip)
@@ -2908,14 +3002,15 @@ Lower levels are unaffected."
       (while rest
        (setq elt (car rest)
              rest (cdr rest))
-       (if (dired-in-this-tree-p (directory-file-name (car elt)) dir)
+       (if (file-in-directory-p (directory-file-name (car elt)) dir)
            (setq rest nil
                  pos (dired-goto-subdir (car elt))))))
     (if pos
        (goto-char pos)
       (error "At the bottom"))))
+
 
-;;; hiding
+;;; Hiding
 
 ;;;###autoload
 (defun dired-hide-subdir (arg)
@@ -2959,10 +3054,8 @@ Use \\[dired-hide-subdir] to (un)hide a particular 
subdirectory."
             (dired--hide start end))
           (setq pos (cdr subdir))))))) ; prev dir gets current dir
 
-;;;###end dired-ins.el
-
 
-;; Search only in file names in the Dired buffer.
+;;; Search only in file names in the Dired buffer
 
 (defcustom dired-isearch-filenames nil
   "Non-nil to Isearch in file names only.
@@ -3032,7 +3125,7 @@ is part of a file name (i.e., has the text property 
`dired-filename')."
   (isearch-forward-regexp nil t))
 
 
-;; Functions for searching in tags style among marked files.
+;;; Functions for searching in tags style among marked files
 
 ;;;###autoload
 (defun dired-do-isearch ()
@@ -3124,10 +3217,12 @@ REGEXP should use constructs supported by your local 
`grep' command."
                                   files))
                    (push mark files)))
                (nreverse marks))
+              (message "Searching...")
               (setq xrefs
                     (xref-matches-in-files regexp files))
               (unless xrefs
                 (user-error "No matches for: %s" regexp))
+              (message "Searching...done")
               xrefs))))
     (xref--show-xrefs fetcher nil)))
 
diff --git a/lisp/dired-x.el b/lisp/dired-x.el
index 5f31bc4..8d99d1a 100644
--- a/lisp/dired-x.el
+++ b/lisp/dired-x.el
@@ -44,7 +44,8 @@
 ;; but maybe not if a dired-x function is being autoloaded.
 (require 'dired)
 
-;;; User-defined variables.
+
+;;; User-defined variables
 
 (defgroup dired-x nil
   "Extended directory editing (dired-x)."
@@ -217,7 +218,9 @@ to nil: a pipe using `zcat' or `gunzip -c' will be used."
   :type 'boolean
   :group 'dired-x)
 
-;;; KEY BINDINGS.
+
+;;; Key bindings
+
 (when (keymapp (lookup-key dired-mode-map "*"))
   (define-key dired-mode-map "*(" 'dired-mark-sexp)
   (define-key dired-mode-map "*O" 'dired-mark-omitted)
@@ -234,7 +237,8 @@ to nil: a pipe using `zcat' or `gunzip -c' will be used."
 (define-key dired-mode-map "Y"  'dired-do-relsymlink)
 (define-key dired-mode-map "V" 'dired-do-run-mail)
 
-;;; MENU BINDINGS
+
+;;; Menu bindings
 
 (when-let ((menu (lookup-key dired-mode-map [menu-bar])))
   (easy-menu-add-item menu '("Operate")
@@ -274,7 +278,7 @@ files"]
                       "Refresh"))
 
 
-;; Install into appropriate hooks.
+;;; Install into appropriate hooks
 
 (add-hook 'dired-mode-hook 'dired-extra-startup)
 (add-hook 'dired-after-readin-hook 'dired-omit-expunge)
@@ -303,7 +307,7 @@ See also the functions:
   (dired-omit-startup))
 
 
-;;; EXTENSION MARKING FUNCTIONS.
+;;; Extension marking functions
 
 (defun dired--mark-suffix-interactive-spec ()
   (let* ((default
@@ -432,7 +436,7 @@ See variables `dired-texinfo-unclean-extensions',
                                 (list ".dvi"))))
 
 
-;;; OMITTING.
+;;; Omitting
 
 ;; Enhanced omitting of lines from directory listings.
 ;; Marked files are never omitted.
@@ -570,13 +574,13 @@ files in the active region if `dired-mark-region' is 
non-nil."
      msg)))
 
 
-;;; VIRTUAL DIRED MODE.
+;;; Virtual dired mode
 
 ;; For browsing `ls -lR' listings in a dired-like fashion.
 
 (defalias 'virtual-dired 'dired-virtual)
 (defun dired-virtual (dirname &optional switches)
-  "Put this buffer into Virtual Dired mode.
+  "Put this Dired buffer into Virtual Dired mode.
 
 In Virtual Dired mode, all commands that do not actually consult the
 filesystem will work.
@@ -608,7 +612,8 @@ you can relist single subdirs using \\[dired-do-redisplay]."
   ;; hand if you want them.
 
   (interactive
-   (list (read-string "Virtual Dired directory: " (dired-virtual-guess-dir))))
+   (list (read-directory-name "Virtual Dired directory: "
+                              nil (dired-virtual-guess-dir))))
   (goto-char (point-min))
   (or (looking-at-p "  ")
       ;; if not already indented, do it now:
@@ -622,7 +627,7 @@ you can relist single subdirs using \\[dired-do-redisplay]."
                     (and (looking-at "^  wildcard ")
                          (buffer-substring (match-end 0)
                                            (line-end-position))))))
-  (if wildcard
+    (if wildcard
         (setq dirname (expand-file-name wildcard default-directory))))
   ;; If raw ls listing (not a saved old dired buffer), give it a
   ;; decent subdir headerline:
@@ -692,7 +697,7 @@ Also useful for `auto-mode-alist' like this:
   (dired-virtual (dired-virtual-guess-dir)))
 
 
-;;; SMART SHELL.
+;;; Smart shell
 
 ;; An Emacs buffer can have but one working directory, stored in the
 ;; buffer-local variable `default-directory'.  A Dired buffer may have
@@ -719,30 +724,30 @@ Also useful for `auto-mode-alist' like this:
     (shell-command command output-buffer error-buffer)))
 
 
-;;; GUESS SHELL COMMAND.
+;;; Guess shell command
 
 ;; Brief Description:
-;;;
+;;
 ;; * `dired-do-shell-command' is bound to `!' by dired.el.
-;;;
+;;
 ;; * `dired-guess-shell-command' provides smarter defaults for
-;;;    dired-aux.el's `dired-read-shell-command'.
-;;;
+;;    dired-aux.el's `dired-read-shell-command'.
+;;
 ;; * `dired-guess-shell-command' calls `dired-guess-default' with list of
-;;;    marked files.
-;;;
+;;    marked files.
+;;
 ;; * Parse `dired-guess-shell-alist-user' and
-;;;   `dired-guess-shell-alist-default' (in that order) for the first REGEXP
-;;;   that matches the first file in the file list.
-;;;
+;;   `dired-guess-shell-alist-default' (in that order) for the first REGEXP
+;;   that matches the first file in the file list.
+;;
 ;; * If the REGEXP matches all the entries of the file list then evaluate
-;;;   COMMAND, which is either a string or a Lisp expression returning a
-;;;   string.  COMMAND may be a list of commands.
-;;;
+;;   COMMAND, which is either a string or a Lisp expression returning a
+;;   string.  COMMAND may be a list of commands.
+;;
 ;; * Return this command to `dired-guess-shell-command' which prompts user
-;;;   with it.  The list of commands is put into the list of default values.
-;;;   If a command is used successfully then it is stored permanently in
-;;;   `dired-shell-command-history'.
+;;   with it.  The list of commands is put into the list of default values.
+;;   If a command is used successfully then it is stored permanently in
+;;   `dired-shell-command-history'.
 
 ;; Guess what shell command to apply to a file.
 (defvar dired-shell-command-history nil
@@ -940,10 +945,15 @@ Each element of this list looks like
 
     (REGEXP COMMAND...)
 
-where each COMMAND can either be a string or a Lisp expression that evaluates
+COMMAND will be used if REGEXP matches the file to be processed.
+If several files are to be processed, REGEXP has to match all the
+files.
+
+Each COMMAND can either be a string or a Lisp expression that evaluates
 to a string.  If this expression needs to consult the name of the file for
 which the shell commands are being requested, it can access that file name
 as the variable `file'.
+
 If several COMMANDs are given, the first one will be the default
 and the rest will be added temporarily to the history and can be retrieved
 with \\[previous-history-element] (M-p) .
@@ -1022,7 +1032,7 @@ See `dired-guess-shell-alist-user'."
       (if (equal val "") default val))))
 
 
-;;; RELATIVE SYMBOLIC LINKS.
+;;; Relative symbolic links
 
 (declare-function make-symbolic-link "fileio.c")
 
@@ -1083,7 +1093,7 @@ results in
 
 ;;;###autoload
 (defun dired-do-relsymlink (&optional arg)
-   "Relative symlink all marked (or next ARG) files into a directory.
+  "Relative symlink all marked (or next ARG) files into a directory.
 Otherwise make a relative symbolic link to the current file.
 This creates relative symbolic links like
 
@@ -1096,7 +1106,7 @@ not absolute ones like
 For absolute symlinks, use \\[dired-do-symlink]."
   (interactive "P")
   (dired-do-create-files 'relsymlink #'dired-make-relative-symlink
-                           "RelSymLink" arg dired-keep-marker-relsymlink))
+                         "RelSymLink" arg dired-keep-marker-relsymlink))
 
 (autoload 'dired-mark-read-regexp "dired-aux")
 (autoload 'dired-do-create-files-regexp "dired-aux")
@@ -1111,30 +1121,30 @@ for more info."
    "RelSymLink" arg regexp newname whole-name dired-keep-marker-relsymlink))
 
 
-;;; VISIT ALL MARKED FILES SIMULTANEOUSLY.
+;;; Visit all marked files simultaneously
 
 ;; Brief Description:
-;;;
+;;
 ;; `dired-do-find-marked-files' is bound to `F' by dired-x.el.
-;;;
+;;
 ;; * Use `dired-get-marked-files' to collect the marked files in the current
-;;;   Dired Buffer into a list of filenames `FILE-LIST'.
-;;;
+;;   Dired Buffer into a list of filenames `FILE-LIST'.
+;;
 ;; * Pass FILE-LIST to `dired-simultaneous-find-file' all with
-;;;   `dired-do-find-marked-files''s prefix argument NOSELECT.
-;;;
+;;   `dired-do-find-marked-files''s prefix argument NOSELECT.
+;;
 ;; * `dired-simultaneous-find-file' runs through FILE-LIST decrementing the
-;;;   list each time.
-;;;
+;;   list each time.
+;;
 ;; * If NOSELECT is non-nil then just run `find-file-noselect' on each
-;;;   element of FILE-LIST.
-;;;
+;;   element of FILE-LIST.
+;;
 ;; * If NOSELECT is nil then calculate the `size' of the window for each file
-;;;   by dividing the `window-height' by length of FILE-LIST.  Thus, `size' is
-;;;   cognizant of the window-configuration.
-;;;
+;;   by dividing the `window-height' by length of FILE-LIST.  Thus, `size' is
+;;   cognizant of the window-configuration.
+;;
 ;; * If `size' is too small abort, otherwise run `find-file' on each element
-;;;   of FILE-LIST giving each a window of height `size'.
+;;   of FILE-LIST giving each a window of height `size'.
 
 (defun dired-do-find-marked-files (&optional noselect)
   "Find all marked files displaying all of them simultaneously.
@@ -1180,7 +1190,7 @@ NOSELECT the files are merely found but not selected."
         (find-file file)))))
 
 
-;;; MISCELLANEOUS COMMANDS.
+;;; Miscellaneous commands
 
 ;; Run man on files.
 
@@ -1190,8 +1200,8 @@ NOSELECT the files are merely found but not selected."
 
 (defun dired-man ()
   "Run `man' on this file."
-;; Used also to say: "Display old buffer if buffer name matches filename."
-;; but I have no idea what that means.
+  ;; Used also to say: "Display old buffer if buffer name matches filename."
+  ;; but I have no idea what that means.
   (interactive)
   (require 'man)
   (let* ((file (dired-get-filename))
@@ -1248,7 +1258,7 @@ otherwise."
          (dired-rmail)))))
 
 
-;;; MISCELLANEOUS INTERNAL FUNCTIONS.
+;;; Miscellaneous internal functions
 
 ;; This should be a builtin
 (defun dired-buffer-more-recently-used-p (buffer1 buffer2)
@@ -1258,7 +1268,6 @@ Considers buffers closer to the car of `buffer-list' to 
be more recent."
        (memq buffer1 (buffer-list))
        (not (memq buffer1 (memq buffer2 (buffer-list))))))
 
-
 ;; Needed if ls -lh is supported and also for GNU ls -ls.
 (defun dired-x--string-to-number (str)
   "Like `string-to-number' but recognize a trailing unit prefix.
@@ -1431,7 +1440,7 @@ only in the active region if `dired-mark-region' is 
non-nil."
      (format "'%s file" predicate))))
 
 
-;;; FIND FILE AT POINT.
+;;; Find file at point
 
 (defcustom dired-x-hands-off-my-keys t
   "Non-nil means don't remap `find-file' to `dired-x-find-file'.
@@ -1478,7 +1487,8 @@ a prefix argument, when it offers the filename near point 
as a default."
   (interactive (list (dired-x-read-filename-at-point "Find file: ")))
   (find-file-other-window filename))
 
-;;; Internal functions.
+
+;;; Internal functions
 
 ;; Fixme: This should probably use `thing-at-point'.  -- fx
 (define-obsolete-function-alias 'dired-filename-at-point
@@ -1526,8 +1536,9 @@ If `current-prefix-arg' is non-nil, uses name at point as 
guess."
 
 (define-obsolete-function-alias 'read-filename-at-point
   'dired-x-read-filename-at-point "24.1") ; is this even needed?
+
 
-;;; BUG REPORTS
+;;; Epilog
 
 (define-obsolete-function-alias 'dired-x-submit-report 'report-emacs-bug 
"24.1")
 
diff --git a/lisp/dired.el b/lisp/dired.el
index 11df93e..9ddd2c5 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -41,6 +41,7 @@
 (declare-function dired-buffer-more-recently-used-p
                  "dired-x" (buffer1 buffer2))
 
+
 ;;; Customizable variables
 
 (defgroup dired nil
@@ -53,7 +54,6 @@
   :prefix "dired-"
   :group 'dired)
 
-
 ;;;###autoload
 (defcustom dired-listing-switches (purecopy "-al")
   "Switches passed to `ls' for Dired.  MUST contain the `l' option.
@@ -78,9 +78,9 @@ some of the `ls' switches are not supported; see the doc 
string of
 (defcustom dired-subdir-switches nil
   "If non-nil, switches passed to `ls' for inserting subdirectories.
 If nil, `dired-listing-switches' is used."
-   :group 'dired
-   :type '(choice (const :tag "Use dired-listing-switches" nil)
-                  (string :tag "Switches")))
+  :group 'dired
+  :type '(choice (const :tag "Use dired-listing-switches" nil)
+                 (string :tag "Switches")))
 
 (defcustom dired-maybe-use-globstar nil
   "If non-nil, enable globstar if the shell supports it.
@@ -144,8 +144,8 @@ For more details, see Info node `(emacs)ls in Lisp'."
 
 (defcustom dired-touch-program "touch"
   "Name of touch command (usually `touch')."
-   :group 'dired
-   :type 'file)
+  :group 'dired
+  :type 'file)
 
 (defcustom dired-ls-F-marks-symlinks nil
   "Informs Dired about how `ls -lF' marks symbolic links.
@@ -220,7 +220,7 @@ or the most recently used window with a Dired buffer, or to 
use any other
 function.  When the value is a function, it will be called with no
 arguments and is expected to return a list of directories which will
 be used as defaults (i.e. default target and \"future history\")
-(though, `dired-dwim-target-defaults' might modify it a bit).
+\(though, `dired-dwim-target-defaults' might modify it a bit).
 The value t prefers the next windows on the same frame.
 
 The target is used in the prompt for file copy, rename etc."
@@ -247,16 +247,14 @@ The target is used in the prompt for file copy, rename 
etc."
 This is similar to the \"-L\" option for the \"cp\" shell command."
   :type 'boolean
   :group 'dired)
-                                        ;
-; These variables were deleted and the replacements are on files.el.
-; We leave aliases behind for back-compatibility.
+
+;; These variables were deleted and the replacements are on files.el.
+;; We leave aliases behind for back-compatibility.
 (define-obsolete-variable-alias 'dired-free-space-program
   'directory-free-space-program "27.1")
 (define-obsolete-variable-alias 'dired-free-space-args
   'directory-free-space-args "27.1")
 
-;;; Hook variables
-
 (defcustom dired-load-hook nil
   "Run after loading Dired.
 You can customize key bindings or load extensions with this."
@@ -358,7 +356,8 @@ is anywhere on its Dired line, except the beginning of the 
line."
   :group 'dired
   :version "28.1")
 
-;; Internal variables
+
+;;; Internal variables
 
 (defvar dired-marker-char ?*           ; the answer is 42
   ;; so that you can write things like
@@ -376,8 +375,8 @@ This is what the do-commands look for, and what the 
mark-commands store.")
   "Character used to flag files for deletion.")
 
 (defvar dired-shrink-to-fit t
-;; I see no reason ever to make this nil -- rms.
-;;  (> baud-rate search-slow-speed)
+  ;; I see no reason ever to make this nil -- rms.
+  ;;  (> baud-rate search-slow-speed)
   "Non-nil means Dired shrinks the display buffer to fit the marked files.")
 (make-obsolete-variable 'dired-shrink-to-fit
                        "use the Customization interface to add a new rule
@@ -425,7 +424,7 @@ The directory name must be absolute, but need not be fully 
expanded.")
                                  "[bcsp][^:]"))
 (defvar dired-re-exe;; match ls permission string of an executable file
   (mapconcat (lambda (x)
-               (concat dired-re-maybe-mark dired-re-inode-size x))
+              (concat dired-re-maybe-mark dired-re-inode-size x))
             '("-[-r][-w][xs][-r][-w].[-r][-w]."
               "-[-r][-w].[-r][-w][xs][-r][-w]."
               "-[-r][-w].[-r][-w].[-r][-w][xst]")
@@ -458,6 +457,9 @@ The match starts at the beginning of the line and ends 
after the end
 of the line.
 Subexpression 2 must end right before the \\n.")
 
+
+;;; Faces
+
 (defgroup dired-faces nil
   "Faces used by Dired."
   :group 'dired
@@ -561,6 +563,9 @@ Subexpression 2 must end right before the \\n.")
 (defvar dired-ignored-face 'dired-ignored
   "Face name used for files suffixed with `completion-ignored-extensions'.")
 
+
+;;; Font-lock
+
 (defvar dired-font-lock-keywords
   (list
    ;;
@@ -684,12 +689,15 @@ Subexpression 2 must end right before the \\n.")
    ;;
    ;; Directory headers.
    (list dired-subdir-regexp '(1 dired-header-face))
-)
+   )
   "Additional expressions to highlight in Dired mode.")
 
 (defvar dnd-protocol-alist)
+
 
-;;; Macros must be defined before they are used, for the byte compiler.
+;;; Macros
+
+;; Macros must be defined before they are used, for the byte compiler.
 
 (defmacro dired-mark-if (predicate msg)
   "Mark files for PREDICATE, according to `dired-marker-char'.
@@ -884,7 +892,7 @@ ERROR can be a string with the error message."
     (point-max)))
 
 
-;; The dired command
+;;; The dired command
 
 (defun dired-read-dir-and-switches (str)
   ;; For use in interactive.
@@ -1264,7 +1272,7 @@ The return value is the target column for the file names."
       found)))
 
 
-;; Read in a new dired buffer
+;;; Read in a new dired buffer
 
 (defun dired-readin ()
   "Read in a new Dired buffer.
@@ -1628,8 +1636,9 @@ see `dired-use-ls-dired' for more details.")
            (put-text-property (+ (point) 4) (line-end-position)
                               'invisible 'dired-hide-details-link))))
       (forward-line 1))))
+
 
-;; Reverting a dired buffer
+;;; Reverting a dired buffer
 
 (defun dired-revert (&optional _arg _noconfirm)
   "Reread the Dired buffer.
@@ -1816,8 +1825,9 @@ Do so according to the former subdir alist 
OLD-SUBDIR-ALIST."
   (let ((handler (find-file-name-handler dir 'dired-uncache)))
     (if handler
        (funcall handler 'dired-uncache dir))))
+
 
-;; dired mode key bindings and initialization
+;;; Dired mode key bindings and menus
 
 (defvar dired-mode-map
   ;; This looks ugly when substitute-command-keys uses C-d instead d:
@@ -1969,7 +1979,7 @@ Do so according to the former subdir alist 
OLD-SUBDIR-ALIST."
     ;; No need to do this, now that top-level items are fewer.
     ;;;;
     ;; Get rid of the Edit menu bar item to save space.
-    ;(define-key map [menu-bar edit] 'undefined)
+    ;;(define-key map [menu-bar edit] 'undefined)
 
     map)
   "Local keymap for Dired mode buffers.")
@@ -2178,6 +2188,8 @@ Do so according to the former subdir alist 
OLD-SUBDIR-ALIST."
      :help "Delete image tag from current or marked files"]))
 
 
+;;; Dired mode
+
 ;; Dired mode is suitable only for specially formatted data.
 (put 'dired-mode 'mode-class 'special)
 
@@ -2275,14 +2287,16 @@ Keybindings:
   (add-hook 'file-name-at-point-functions #'dired-file-name-at-point nil t)
   (add-hook 'isearch-mode-hook #'dired-isearch-filenames-setup nil t)
   (run-mode-hooks 'dired-mode-hook))
+
 
-;; Idiosyncratic dired commands that don't deal with marks.
+;;; Idiosyncratic dired commands that don't deal with marks
 
 (defun dired-summary ()
   "Summarize basic Dired commands and show recent Dired errors."
   (interactive)
   (dired-why)
-  ;>> this should check the key-bindings and use substitute-command-keys if 
non-standard
+  ;; FIXME this should check the key-bindings and use
+  ;; substitute-command-keys if non-standard
   (message
    "d-elete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, h-elp"))
 
@@ -2473,8 +2487,9 @@ Otherwise, display it in another buffer."
   (interactive)
   (display-buffer (find-file-noselect (dired-get-file-for-visit))
                  t))
+
 
-;;; Functions for extracting and manipulating file names in Dired buffers.
+;;; Functions for extracting and manipulating file names in Dired buffers
 
 (defun dired-unhide-subdir ()
   (with-silent-modifications
@@ -2581,7 +2596,7 @@ Otherwise, an error occurs in these cases."
       (concat (dired-current-directory localp) file)))))
 
 (defun dired-string-replace-match (regexp string newtext
-                                   &optional literal global)
+                                          &optional literal global)
   "Replace first match of REGEXP in STRING with NEWTEXT.
 If it does not match, nil is returned instead of the new string.
 Optional arg LITERAL means to take NEWTEXT literally.
@@ -2592,7 +2607,7 @@ Optional arg GLOBAL means to replace all matches."
          (let ((from-end (- (length string) (match-end 0))))
            (setq ret (setq string (replace-match newtext t literal string)))
            (setq start (- (length string) from-end))))
-         ret)
+       ret)
     (if (not (string-match regexp string 0))
        nil
       (replace-match newtext t literal string))))
@@ -2619,7 +2634,10 @@ unchanged."
   (if (string-match (concat "^" (regexp-quote dir)) file)
       (substring file (match-end 0))
     file))
+
 
+;;; Mode to hide details
+
 (define-minor-mode dired-hide-details-mode
   "Toggle visibility of detailed information in current Dired buffer.
 When this minor mode is enabled, details such as file ownership and
@@ -2656,6 +2674,7 @@ See options: `dired-hide-details-hide-symlink-targets' and
               'add-to-invisibility-spec
             'remove-from-invisibility-spec)
           'dired-hide-details-link))
+
 
 ;;; Functions to hide/unhide text
 
@@ -2685,7 +2704,7 @@ See options: `dired-hide-details-hide-symlink-targets' and
      (progn (goto-char end) (line-end-position))
      '(invisible))))
 
-;;; Functions for finding the file name in a dired buffer line.
+;;; Functions for finding the file name in a dired buffer line
 
 (defvar dired-permission-flags-regexp
   "\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)"
@@ -2776,15 +2795,15 @@ If EOL, it should be an position to use instead of
       (or no-error
          (not (eq opoint (point)))
          (error "%s" (if hidden
-                    (substitute-command-keys
-                     "File line is hidden, type \\[dired-hide-subdir] to 
unhide")
-                  "No file on this line")))
+                          (substitute-command-keys
+                           "File line is hidden, type \\[dired-hide-subdir] to 
unhide")
+                        "No file on this line")))
       (if (eq opoint (point))
          nil
        (point)))))
 
 
-;;; COPY NAMES OF MARKED FILES INTO KILL-RING.
+;;; Copy names of marked files into kill-ring
 
 (defun dired-copy-filename-as-kill (&optional arg)
   "Copy names of marked (or next ARG) files into the kill ring.
@@ -2818,12 +2837,14 @@ You can then feed the file name(s) to other commands 
with \\[yank]."
       (message "%s" string))))
 
 
-;; Keeping Dired buffers in sync with the filesystem and with each other
+;;; Keeping Dired buffers in sync with the filesystem and with each other
 
-(defun dired-buffers-for-dir (dir &optional file)
+(defun dired-buffers-for-dir (dir &optional file subdirs)
   "Return a list of buffers for DIR (top level or in-situ subdir).
 If FILE is non-nil, include only those whose wildcard pattern (if any)
 matches FILE.
+If SUBDIRS is non-nil, also include the dired buffers of
+directories below DIR.
 The list is in reverse order of buffer creation, most recent last.
 As a side effect, killed dired buffers for DIR are removed from
 dired-buffers."
@@ -2835,19 +2856,20 @@ dired-buffers."
        ((null (buffer-name buf))
        ;; Buffer is killed - clean up:
        (setq dired-buffers (delq elt dired-buffers)))
-       ((dired-in-this-tree-p dir (car elt))
+       ((file-in-directory-p (car elt) dir)
        (with-current-buffer buf
-         (and (assoc dir dired-subdir-alist)
-              (or (null file)
-                  (if (stringp dired-directory)
-                      (let ((wildcards (file-name-nondirectory
-                                        dired-directory)))
-                        (or (zerop (length wildcards))
-                            (string-match-p (dired-glob-regexp wildcards)
-                                             file)))
-                    (member (expand-file-name file dir)
-                            (cdr dired-directory))))
-              (setq result (cons buf result)))))))
+          (when (and (or subdirs
+                         (assoc dir dired-subdir-alist))
+                    (or (null file)
+                        (if (stringp dired-directory)
+                            (let ((wildcards (file-name-nondirectory
+                                              dired-directory)))
+                              (or (zerop (length wildcards))
+                                  (string-match-p (dired-glob-regexp wildcards)
+                                                   file)))
+                          (member (expand-file-name file dir)
+                                  (cdr dired-directory)))))
+            (setq result (cons buf result)))))))
     result))
 
 (defun dired-glob-regexp (pattern)
@@ -2884,8 +2906,6 @@ dired-buffers."
             (substring pattern matched-in-pattern))
            "\\'")))
 
-
-
 (defun dired-advertise ()
   ;;"Advertise in variable `dired-buffers' that we dired `default-directory'."
   ;; With wildcards we actually advertise too much.
@@ -2903,15 +2923,15 @@ dired-buffers."
   ;; Removing is also done as a side-effect in dired-buffer-for-dir.
   (setq dired-buffers
        (delq (assoc (expand-file-name dir) dired-buffers) dired-buffers)))
-
-;; Tree Dired
 
-;;; utility functions
+
+;;; Utility functions
 
 (defun dired-in-this-tree-p (file dir)
   ;;"Is FILE part of the directory tree starting at DIR?"
   (let (case-fold-search)
     (string-match-p (concat "^" (regexp-quote dir)) file)))
+(make-obsolete 'dired-in-this-tree-p 'file-in-directory-p "28.1")
 (define-obsolete-function-alias 'dired-in-this-tree
   'dired-in-this-tree-p "27.1")
 
@@ -2932,8 +2952,8 @@ dired-buffers."
       (beginning-of-line)              ; alist stores b-o-l positions
       (and (zerop (- (point)
                      (cdr (assoc cur-dir
-                                                 dired-subdir-alist))))
-          cur-dir))))
+                                 dired-subdir-alist))))
+           cur-dir))))
 
 (define-obsolete-function-alias 'dired-get-subdir-min 'cdr "27.1")
 
@@ -3042,11 +3062,11 @@ instead of `dired-actual-switches'."
                    new-dir-name)
              (setq new-dir-name res)))
          (dired-alist-add-1 new-dir-name
-           ;; Place a sub directory boundary between lines.
-           (save-excursion
-             (goto-char (match-beginning 0))
-             (beginning-of-line)
-             (point-marker)))))
+                             ;; Place a sub directory boundary between lines.
+                             (save-excursion
+                               (goto-char (match-beginning 0))
+                               (beginning-of-line)
+                               (point-marker)))))
       (if (and (> count 1) (called-interactively-p 'interactive))
          (message "Buffer includes %d directories" count)))
     ;; We don't need to sort it because it is in buffer order per
@@ -3165,7 +3185,7 @@ It runs the hook `dired-initial-position-hook'."
        (dired-goto-subdir dirname))
   (if dired-trivial-filenames (dired-goto-next-nontrivial-file))
   (run-hooks 'dired-initial-position-hook))
-
+
 ;; These are hooks which make tree dired work.
 ;; They are in this file because other parts of dired need to call them.
 ;; But they don't call the rest of tree dired unless there are subdirs loaded.
@@ -3204,8 +3224,9 @@ is the directory where the file on this line resides."
     (if (or (null (cdr dired-subdir-alist)) (not (dired-next-subdir 1 t t)))
        (point-max)
       (point))))
+
 
-;; Deleting files
+;;; Deleting files
 
 (defcustom dired-recursive-deletes 'top
   "Whether Dired deletes directories recursively.
@@ -3280,15 +3301,19 @@ non-empty directories is allowed."
   (interactive)
   (let* ((dired-marker-char dired-del-marker)
         (regexp (dired-marker-regexp))
-        case-fold-search)
+        case-fold-search markers)
     (if (save-excursion (goto-char (point-min))
                        (re-search-forward regexp nil t))
        (dired-internal-do-deletions
          (nreverse
          ;; this can't move point since ARG is nil
-         (dired-map-over-marks (cons (dired-get-filename) (point))
+         (dired-map-over-marks (cons (dired-get-filename)
+                                      (let ((m (point-marker)))
+                                        (push m markers)
+                                        m))
                                nil))
         nil t)
+      (dolist (m markers) (set-marker m nil))
       (or nomessage
          (message "(No deletions requested)")))))
 
@@ -3299,12 +3324,17 @@ non-empty directories is allowed."
   ;; This is more consistent with the file marking feature than
   ;; dired-do-flagged-delete.
   (interactive "P")
-  (dired-internal-do-deletions
-   (nreverse
-    ;; this may move point if ARG is an integer
-    (dired-map-over-marks (cons (dired-get-filename) (point))
-                         arg))
-   arg t))
+  (let (markers)
+    (dired-internal-do-deletions
+     (nreverse
+      ;; this may move point if ARG is an integer
+      (dired-map-over-marks (cons (dired-get-filename)
+                                  (let ((m (point-marker)))
+                                    (push m markers)
+                                    m))
+                            arg))
+     arg t)
+    (dolist (m markers) (set-marker m nil))))
 
 (defvar dired-deletion-confirmer 'yes-or-no-p) ; or y-or-n-p?
 
@@ -3312,11 +3342,6 @@ non-empty directories is allowed."
   ;; L is an alist of files to delete, with their buffer positions.
   ;; ARG is the prefix arg.
   ;; Filenames are absolute.
-  ;; (car L) *must* be the *last* (bottommost) file in the dired buffer.
-  ;; That way as changes are made in the buffer they do not shift the
-  ;; lines still to be changed, so the (point) values in L stay valid.
-  ;; Also, for subdirs in natural order, a subdir's files are deleted
-  ;; before the subdir itself - the other way around would not work.
   (let* ((files (mapcar #'car l))
         (count (length l))
         (succ 0)
@@ -3337,9 +3362,10 @@ non-empty directories is allowed."
                 (make-progress-reporter
                  (if trashing "Trashing..." "Deleting...")
                  succ count))
-               failures) ;; files better be in reverse order for this loop!
+               failures)
            (while l
-             (goto-char (cdr (car l)))
+             (goto-char (marker-position (cdr (car l))))
+              (dired-move-to-filename)
              (let ((inhibit-read-only t))
                (condition-case err
                    (let ((fn (car (car l))))
@@ -3369,7 +3395,7 @@ non-empty directories is allowed."
 (defun dired-fun-in-all-buffers (directory file fun &rest args)
   "In all buffers dired'ing DIRECTORY, run FUN with ARGS.
 If the buffer has a wildcard pattern, check that it matches FILE.
-(FILE does not include a directory component.)
+\(FILE does not include a directory component.)
 FILE may be nil, in which case ignore it.
 Return list of buffers where FUN succeeded (i.e., returned non-nil)."
   (let (success-list)
@@ -3422,20 +3448,26 @@ confirmation.  To disable the confirmation, see
                                      (file-name-nondirectory fn))))
                (not dired-clean-confirm-killing-deleted-buffers))
            (kill-buffer buf)))
-    (let ((buf-list (dired-buffers-for-dir (expand-file-name fn))))
+    (let ((buf-list (dired-buffers-for-dir (expand-file-name fn)
+                                           nil 'subdirs)))
       (and buf-list
            (or (and dired-clean-confirm-killing-deleted-buffers
-                    (y-or-n-p (format
-                               (ngettext "Kill Dired buffer of %s, too? "
-                                         "Kill Dired buffers of %s, too? "
-                                         (length buf-list))
-                               (file-name-nondirectory fn))))
+                    (y-or-n-p
+                     (format
+                      (ngettext "Kill Dired buffer of %s, too? "
+                                "Kill Dired buffers of %s, too? "
+                                (length buf-list))
+                      (file-name-nondirectory
+                       ;; FN may end in a / if `dired-listing-switches'
+                       ;; contains -p, so we need to strip that
+                       ;; (bug#48301).
+                       (directory-file-name fn)))))
                (not dired-clean-confirm-killing-deleted-buffers))
            (dolist (buf buf-list)
              (kill-buffer buf))))))
 
 
-;; Confirmation
+;;; Confirmation
 
 (defun dired-marker-regexp ()
   (concat "^" (regexp-quote (char-to-string dired-marker-char))))
@@ -3554,8 +3586,9 @@ argument or confirmation)."
   (let ((beg (point)))
     (completion--insert-strings files)
     (put-text-property beg (point) 'mouse-face nil)))
+
 
-;; Commands to mark or flag file(s) at or near current line.
+;;; Commands to mark or flag file(s) at or near current line
 
 (defun dired-repeat-over-lines (arg function)
   ;; This version skips non-file lines.
@@ -3743,8 +3776,9 @@ on the whole buffer."
                        (list ?\s dired-marker-char)
                      (list dired-marker-char ?\s))))
         (forward-line 1)))))
+
 
-;;; Commands to mark or flag files based on their characteristics or names.
+;;; Commands to mark or flag files based on their characteristics or names
 
 (defvar dired-regexp-history nil
   "History list of regular expressions used in Dired commands.")
@@ -3845,8 +3879,7 @@ since it was last visited."
                  (with-temp-buffer
                    (insert-file-contents fn)
                    (goto-char (point-min))
-                   (re-search-forward regexp nil t))))
-                     )))
+                   (re-search-forward regexp nil t)))))))
      "matching file")))
 
 (defun dired-flag-files-regexp (regexp)
@@ -4021,8 +4054,9 @@ Type SPC or `y' to unmark one file, DEL or `n' to skip to 
next,
       (message (if (= count 1) "1 mark removed"
                 "%d marks removed")
               count))))
+
 
-;; Logging failures operating on files, and showing the results.
+;;; Logging failures operating on files, and showing the results
 
 (defvar dired-log-buffer "*Dired log*")
 
@@ -4087,6 +4121,7 @@ or nil if file names are not applicable."
   ;; Log a summary describing a bunch of errors.
   (dired-log (concat "\n" string "\n"))
   (dired-log t))
+
 
 ;;; Sorting
 
@@ -4268,9 +4303,9 @@ To be called first in body of `dired-sort-other', etc."
            ;; No pre-R subdir alist, so revert to main directory
            ;; listing:
            (list (car (reverse dired-subdir-alist))))))))
-
 
-;;;;  Drag and drop support
+
+;;; Drag and drop support
 
 (defcustom dired-recursive-copies 'top
   "Whether Dired copies directories recursively.
@@ -4372,9 +4407,9 @@ Ask means pop up a menu for the user to select one of 
copy, move or link."
   (let ((local-file (dnd-get-local-file-uri uri)))
     (if local-file (dired-dnd-handle-local-file local-file action)
       nil)))
-
 
-;;;;  Desktop support
+
+;;; Desktop support
 
 (eval-when-compile (require 'desktop))
 (declare-function desktop-file-name "desktop" (filename dirname))
@@ -4391,10 +4426,10 @@ Ask means pop up a menu for the user to select one of 
copy, move or link."
      (desktop-file-name dired-directory dirname))
    ;; Subdirectories in `dired-subdir-alist'.
    (cdr
-     (nreverse
-       (mapcar
-        (lambda (f) (desktop-file-name (car f) dirname))
-         dired-subdir-alist)))))
+    (nreverse
+     (mapcar
+      (lambda (f) (desktop-file-name (car f) dirname))
+      dired-subdir-alist)))))
 
 (defun dired-restore-desktop-buffer (_file-name
                                      _buffer-name
@@ -4420,7 +4455,7 @@ Ask means pop up a menu for the user to select one of 
copy, move or link."
             '(dired-mode . dired-restore-desktop-buffer))
 
 
-;;;; Jump to Dired
+;;; Jump to Dired
 
 (defvar archive-superior-buffer)
 (defvar tar-superior-buffer)
diff --git a/lisp/display-line-numbers.el b/lisp/display-line-numbers.el
index a6fa813..7292849 100644
--- a/lisp/display-line-numbers.el
+++ b/lisp/display-line-numbers.el
@@ -56,12 +56,17 @@ See `display-line-numbers' for value options."
 
 (defcustom display-line-numbers-width-start nil
   "If non-nil, count number of lines to use for line number width.
-When `display-line-numbers-mode' is turned on,
-`display-line-numbers-width' is set to the minimum width necessary
-to display all line numbers in the buffer."
+When `display-line-numbers-mode' is turned on, if this option is
+non-nil, `display-line-numbers-width' is set up front to a width
+necessary to display all line numbers in the buffer.  If the value
+is a positive number, it is interpreted as extra lines to account
+for when computing the required width; this should be set to the
+number of lines in the tallest window in which you want to prevent
+the line-number width from changing."
   :group 'display-line-numbers
-  :type 'boolean
-  :version "26.1")
+  :type '(choice (boolean :tag "Minimum width for buffer's line count")
+                 (integer :tag "Number of extra lines to account for"))
+  :version "28.1")
 
 (defun display-line-numbers-update-width ()
   "Prevent the line number width from shrinking."
@@ -83,7 +88,11 @@ the mode is on, set `display-line-numbers' directly."
         (when display-line-numbers-width-start
           (setq display-line-numbers-width
                 (length (number-to-string
-                         (count-lines (point-min) (point-max))))))
+                         (+ (count-lines (point-min) (point-max))
+                            (if (and (numberp display-line-numbers-width-start)
+                                     (> display-line-numbers-width-start 0))
+                                display-line-numbers-width-start
+                              0))))))
         (when display-line-numbers-grow-only
           (add-hook 'pre-command-hook #'display-line-numbers-update-width nil 
t))
         (setq display-line-numbers display-line-numbers-type))
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 0ae2293..a0ffcac 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -1913,6 +1913,11 @@ toggle between displaying the document or editing it as 
text.
     (unless (memq doc-view-doc-type '(ps))
       (setq-local require-final-newline nil))
 
+    ;; These modes will just display "1", so they're not very useful
+    ;; in this mode.
+    (setq-local global-linum-mode nil
+                display-line-numbers-mode nil)
+
     (doc-view-make-safe-dir doc-view-cache-directory)
     ;; Handle compressed files, remote files, files inside archives
     (setq-local doc-view--buffer-file-name
diff --git a/lisp/electric.el b/lisp/electric.el
index 6701a36..4394fae 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -245,10 +245,7 @@ or comment."
                              'electric-indent-functions
                              last-command-event)
                             (memq last-command-event electric-indent-chars))))
-               (not
-                (or (memq act '(nil no-indent))
-                    ;; In a string or comment.
-                    (unless (eq act 'do-indent) (nth 8 (syntax-ppss))))))))
+               (not (memq act '(nil no-indent))))))
       ;; If we error during indent, silently give up since this is an
       ;; automatic action that the user didn't explicitly request.
       ;; But we don't want to suppress errors from elsewhere in *this*
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index dc8636f..8e8d0e2 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -2076,7 +2076,7 @@ mapped to the closest extremal position).
 If FUNCTION was not advised already, its advice info will be
 initialized.  Redefining a piece of advice whose name is part of
 the cache-id will clear the cache."
-  (when (and (featurep 'nativecomp)
+  (when (and (featurep 'native-compile)
              (subr-primitive-p (symbol-function function)))
     (comp-subr-trampoline-install function))
   (cond ((not (ad-is-advised function))
diff --git a/lisp/emacs-lisp/benchmark.el b/lisp/emacs-lisp/benchmark.el
index 439d3bd..64c6288 100644
--- a/lisp/emacs-lisp/benchmark.el
+++ b/lisp/emacs-lisp/benchmark.el
@@ -37,8 +37,7 @@
   "Return the time in seconds elapsed for execution of FORMS."
   (declare (indent 0) (debug t))
   (let ((t1 (make-symbol "t1")))
-    `(let (,t1)
-       (setq ,t1 (current-time))
+    `(let ((,t1 (current-time)))
        ,@forms
        (float-time (time-since ,t1)))))
 
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 33b4d4b..2fff0bd 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -225,6 +225,14 @@
        (byte-compile-log-lap-1 ,format-string ,@args)))
 
 
+(defvar byte-optimize--lexvars nil
+  "Lexical variables in scope, in reverse order of declaration.
+Each element is on the form (NAME KEEP [VALUE]), where:
+  NAME is the variable name,
+  KEEP is a boolean indicating whether the binding must be retained,
+  VALUE, if present, is a substitutable expression.
+Earlier variables shadow later ones with the same name.")
+
 ;;; byte-compile optimizers to support inlining
 
 (put 'inline 'byte-optimizer #'byte-optimize-inline-handler)
@@ -268,32 +276,31 @@
        ;; The byte-code will be really inlined in byte-compile-unfold-bcf.
        `(,fn ,@(cdr form)))
       ((or `(lambda . ,_) `(closure . ,_))
-       (if (not (or (eq fn localfn)     ;From the same file => same mode.
-                    (eq (car fn)        ;Same mode.
-                        (if lexical-binding 'closure 'lambda))))
-           ;; While byte-compile-unfold-bcf can inline dynbind byte-code into
-           ;; letbind byte-code (or any other combination for that matter), we
-           ;; can only inline dynbind source into dynbind source or letbind
-           ;; source into letbind source.
-           (progn
-             ;; We can of course byte-compile the inlined function
-             ;; first, and then inline its byte-code.
-             (byte-compile name)
-             `(,(symbol-function name) ,@(cdr form)))
-         (let ((newfn (if (eq fn localfn)
-                          ;; If `fn' is from the same file, it has already
-                          ;; been preprocessed!
-                          `(function ,fn)
-                        ;; Try and process it "in its original environment".
-                        (let ((byte-compile-bound-variables nil))
-                          (byte-compile-preprocess
-                           (byte-compile--reify-function fn))))))
-           (if (eq (car-safe newfn) 'function)
-               (macroexp--unfold-lambda `(,(cadr newfn) ,@(cdr form)))
-             ;; This can happen because of macroexp-warn-and-return &co.
-             (byte-compile-warn
-              "Inlining closure %S failed" name)
-             form))))
+       ;; While byte-compile-unfold-bcf can inline dynbind byte-code into
+       ;; letbind byte-code (or any other combination for that matter), we
+       ;; can only inline dynbind source into dynbind source or letbind
+       ;; source into letbind source.
+       ;; When the function comes from another file, we byte-compile
+       ;; the inlined function first, and then inline its byte-code.
+       ;; This also has the advantage that the final code does not
+       ;; depend on the order of compilation of ELisp files, making
+       ;; the build more reproducible.
+       (if (eq fn localfn)
+           ;; From the same file => same mode.
+           (macroexp--unfold-lambda `(,fn ,@(cdr form)))
+         ;; Since we are called from inside the optimiser, we need to make
+         ;; sure not to propagate lexvar values.
+         (let ((byte-optimize--lexvars nil)
+               ;; Silence all compilation warnings: the useful ones should
+               ;; be displayed when the function's source file will be
+               ;; compiled anyway, but more importantly we would otherwise
+               ;; emit spurious warnings here because we don't have the full
+               ;; context, such as `declare-functions' placed earlier in the
+               ;; source file's code or `with-suppressed-warnings' that
+               ;; surrounded the `defsubst'.
+               (byte-compile-warnings nil))
+           (byte-compile name))
+         `(,(symbol-function name) ,@(cdr form))))
 
       (_ ;; Give up on inlining.
        form))))
@@ -308,14 +315,6 @@
 This does usually not indicate a problem and makes the compiler
 very chatty, but can be useful for debugging.")
 
-(defvar byte-optimize--lexvars nil
-  "Lexical variables in scope, in reverse order of declaration.
-Each element is on the form (NAME KEEP [VALUE]), where:
-  NAME is the variable name,
-  KEEP is a boolean indicating whether the binding must be retained,
-  VALUE, if present, is a substitutable expression.
-Earlier variables shadow later ones with the same name.")
-
 (defvar byte-optimize--vars-outside-condition nil
   "Alist of variables lexically bound outside conditionally executed code.
 Variables here are sensitive to mutation inside the conditional code,
@@ -344,7 +343,7 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
       (numberp expr)
       (stringp expr)
       (and (consp expr)
-           (eq (car expr) 'quote)
+           (memq (car expr) '(quote function))
            (symbolp (cadr expr)))
       (keywordp expr)))
 
@@ -369,7 +368,7 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
   ;; to   `(if . (or `(,exp ,then ,else) pcase--dontcare))'.
   ;;
   ;; The resulting macroexpansion is also significantly cleaner/smaller/faster.
-  (declare (indent 1) (debug (form &rest (pcase-PAT body))))
+  (declare (indent 1) (debug pcase))
   `(pcase ,exp
      . ,(mapcar (lambda (case)
                   `(,(pcase (car case)
@@ -951,12 +950,20 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
   "Whether EXPR is a constant symbol."
   (and (macroexp-const-p expr) (symbolp (eval expr))))
 
+(defun byte-optimize--fixnump (o)
+  "Return whether O is guaranteed to be a fixnum in all Emacsen.
+See Info node `(elisp) Integer Basics'."
+  (and (fixnump o) (<= -536870912 o 536870911)))
+
 (defun byte-optimize-equal (form)
-  ;; Replace `equal' or `eql' with `eq' if at least one arg is a symbol.
+  ;; Replace `equal' or `eql' with `eq' if at least one arg is a
+  ;; symbol or fixnum.
   (byte-optimize-binary-predicate
    (if (= (length (cdr form)) 2)
        (if (or (byte-optimize--constant-symbol-p (nth 1 form))
-               (byte-optimize--constant-symbol-p (nth 2 form)))
+               (byte-optimize--constant-symbol-p (nth 2 form))
+               (byte-optimize--fixnump (nth 1 form))
+               (byte-optimize--fixnump (nth 2 form)))
            (cons 'eq (cdr form))
          form)
      ;; Arity errors reported elsewhere.
@@ -964,14 +971,19 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
 
 (defun byte-optimize-member (form)
   ;; Replace `member' or `memql' with `memq' if the first arg is a symbol,
-  ;; or the second arg is a list of symbols.
+  ;; or the second arg is a list of symbols.  Same with fixnums.
   (if (= (length (cdr form)) 2)
       (if (or (byte-optimize--constant-symbol-p (nth 1 form))
+              (byte-optimize--fixnump (nth 1 form))
               (let ((arg2 (nth 2 form)))
                 (and (macroexp-const-p arg2)
                      (let ((listval (eval arg2)))
                        (and (listp listval)
-                            (not (memq nil (mapcar #'symbolp listval))))))))
+                            (not (memq nil (mapcar
+                                            (lambda (o)
+                                              (or (symbolp o)
+                                                  (byte-optimize--fixnump o)))
+                                            listval))))))))
           (cons 'memq (cdr form))
         form)
     ;; Arity errors reported elsewhere.
@@ -979,11 +991,12 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
 
 (defun byte-optimize-assoc (form)
   ;; Replace 2-argument `assoc' with `assq', `rassoc' with `rassq',
-  ;; if the first arg is a symbol.
+  ;; if the first arg is a symbol or fixnum.
   (cond
    ((/= (length form) 3)
     form)
-   ((byte-optimize--constant-symbol-p (nth 1 form))
+   ((or (byte-optimize--constant-symbol-p (nth 1 form))
+        (byte-optimize--fixnump (nth 1 form)))
     (cons (if (eq (car form) 'assoc) 'assq 'rassq)
           (cdr form)))
    (t (byte-optimize-constant-args form))))
@@ -1256,6 +1269,14 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
        form)
     form))
 
+(put 'cons 'byte-optimizer #'byte-optimize-cons)
+(defun byte-optimize-cons (form)
+  ;; (cons X nil) => (list X)
+  (if (and (= (safe-length form) 3)
+           (null (nth 2 form)))
+      `(list ,(nth 1 form))
+    form))
+
 ;; Fixme: delete-char -> delete-region (byte-coded)
 ;; optimize string-as-unibyte, string-as-multibyte, string-make-unibyte,
 ;; string-make-multibyte for constant args.
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 9be54ca..3e65db4 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -603,15 +603,11 @@ Each element is (INDEX . VALUE)")
   form lexical)
 
 (defvar byte-native-compiling nil
-  "Non nil while native compiling.")
+  "Non-nil while native compiling.")
 (defvar byte-native-qualities nil
   "To spill default qualities from the compiled file.")
-(defvar byte-native-for-bootstrap nil
-  "Non nil while compiling for bootstrap."
-  ;; During bootstrap we produce both the .eln and the .elc together.
-  ;; Because the make target is the later this has to be produced as
-  ;; last to be resilient against build interruptions.
-)
+(defvar byte+native-compile nil
+  "Non-nil while producing at the same time byte and native code.")
 (defvar byte-to-native-lambdas-h nil
   "Hash byte-code -> byte-to-native-lambda.")
 (defvar byte-to-native-top-level-forms nil
@@ -1639,7 +1635,10 @@ URLs."
          ;; Ignore these `substitute-command-keys' substitutions.
          (seq "\\" (or "="
                        (seq "<" (* (not ">")) ">")
-                       (seq "{" (* (not "}")) "}")))))
+                       (seq "{" (* (not "}")) "}")))
+         ;; Ignore the function signature that's stashed at the end of
+         ;; the doc string (in some circumstances).
+         (seq bol "(fn (" (* nonl))))
     ""
     ;; Heuristic: assume these substitutions are of some length N.
     (replace-regexp-in-string
@@ -1758,7 +1757,7 @@ It is too wide if it has any lines longer than the 
largest of
                overriding-plist-environment)))))
 
 (defmacro displaying-byte-compile-warnings (&rest body)
-  (declare (debug t))
+  (declare (debug (def-body)))
   `(let* ((--displaying-byte-compile-warnings-fn (lambda () ,@body))
          (warning-series-started
           (and (markerp warning-series)
@@ -2067,74 +2066,73 @@ See also `emacs-lisp-byte-compile-and-load'."
          (message "Compiling %s...done" filename))
        (kill-buffer input-buffer)
        (with-current-buffer output-buffer
-         (goto-char (point-max))
-         (insert "\n")                 ; aaah, unix.
-         (cond
-          ((null target-file) nil)     ;We only wanted the warnings!
-          ((or byte-native-compiling
-               (and (file-writable-p target-file)
-                    ;; We attempt to create a temporary file in the
-                    ;; target directory, so the target directory must be
-                    ;; writable.
-                    (file-writable-p
-                     (file-name-directory
-                      ;; Need to expand in case TARGET-FILE doesn't
-                      ;; include a directory (Bug#45287).
-                      (expand-file-name target-file)))))
-           ;; We must disable any code conversion here.
-           (let* ((coding-system-for-write 'no-conversion)
-                  ;; Write to a tempfile so that if another Emacs
-                  ;; process is trying to load target-file (eg in a
-                  ;; parallel bootstrap), it does not risk getting a
-                  ;; half-finished file.  (Bug#4196)
-                  (tempfile
-                   (make-temp-file (when (file-writable-p target-file)
-                                      (expand-file-name target-file))))
-                  (default-modes (default-file-modes))
-                  (temp-modes (logand default-modes #o600))
-                  (desired-modes (logand default-modes #o666))
-                  (kill-emacs-hook
-                   (cons (lambda () (ignore-errors
-                                 (delete-file tempfile)))
-                         kill-emacs-hook)))
-             (unless (= temp-modes desired-modes)
-               (set-file-modes tempfile desired-modes 'nofollow))
-             (write-region (point-min) (point-max) tempfile nil 1)
-             ;; This has the intentional side effect that any
-             ;; hard-links to target-file continue to
-             ;; point to the old file (this makes it possible
-             ;; for installed files to share disk space with
-             ;; the build tree, without causing problems when
-             ;; emacs-lisp files in the build tree are
-             ;; recompiled).  Previously this was accomplished by
-             ;; deleting target-file before writing it.
-             (if byte-native-compiling
-                  (if byte-native-for-bootstrap
-                      ;; Defer elc final renaming.
-                      (setf byte-to-native-output-file
-                            (cons tempfile target-file))
-                    (delete-file tempfile))
-                (rename-file tempfile target-file t)))
-           (or noninteractive
-               byte-native-compiling
-               (message "Wrote %s" target-file)))
-           ((file-writable-p target-file)
-            ;; In case the target directory isn't writable (see e.g. 
Bug#44631),
-            ;; try writing to the output file directly.  We must disable any
-            ;; code conversion here.
-            (let ((coding-system-for-write 'no-conversion))
-              (with-file-modes (logand (default-file-modes) #o666)
-                (write-region (point-min) (point-max) target-file nil 1)))
-            (or noninteractive (message "Wrote %s" target-file)))
-          (t
-           ;; This is just to give a better error message than write-region
-           (let ((exists (file-exists-p target-file)))
-             (signal (if exists 'file-error 'file-missing)
-                     (list "Opening output file"
-                           (if exists
-                               "Cannot overwrite file"
-                             "Directory not writable or nonexistent")
-                           target-file)))))
+          (when (and target-file
+                     (or (not byte-native-compiling)
+                         (and byte-native-compiling byte+native-compile)))
+           (goto-char (point-max))
+           (insert "\n")                       ; aaah, unix.
+           (cond
+            ((and (file-writable-p target-file)
+                  ;; We attempt to create a temporary file in the
+                  ;; target directory, so the target directory must be
+                  ;; writable.
+                  (file-writable-p
+                   (file-name-directory
+                    ;; Need to expand in case TARGET-FILE doesn't
+                    ;; include a directory (Bug#45287).
+                    (expand-file-name target-file))))
+             ;; We must disable any code conversion here.
+             (let* ((coding-system-for-write 'no-conversion)
+                    ;; Write to a tempfile so that if another Emacs
+                    ;; process is trying to load target-file (eg in a
+                    ;; parallel bootstrap), it does not risk getting a
+                    ;; half-finished file.  (Bug#4196)
+                    (tempfile
+                     (make-temp-file (when (file-writable-p target-file)
+                                        (expand-file-name target-file))))
+                    (default-modes (default-file-modes))
+                    (temp-modes (logand default-modes #o600))
+                    (desired-modes (logand default-modes #o666))
+                    (kill-emacs-hook
+                     (cons (lambda () (ignore-errors
+                                   (delete-file tempfile)))
+                           kill-emacs-hook)))
+               (unless (= temp-modes desired-modes)
+                 (set-file-modes tempfile desired-modes 'nofollow))
+               (write-region (point-min) (point-max) tempfile nil 1)
+               ;; This has the intentional side effect that any
+               ;; hard-links to target-file continue to
+               ;; point to the old file (this makes it possible
+               ;; for installed files to share disk space with
+               ;; the build tree, without causing problems when
+               ;; emacs-lisp files in the build tree are
+               ;; recompiled).  Previously this was accomplished by
+               ;; deleting target-file before writing it.
+               (if byte-native-compiling
+                    ;; Defer elc final renaming.
+                    (setf byte-to-native-output-file
+                          (cons tempfile target-file))
+                  (rename-file tempfile target-file t)))
+             (or noninteractive
+                 byte-native-compiling
+                 (message "Wrote %s" target-file)))
+             ((file-writable-p target-file)
+              ;; In case the target directory isn't writable (see e.g. 
Bug#44631),
+              ;; try writing to the output file directly.  We must disable any
+              ;; code conversion here.
+              (let ((coding-system-for-write 'no-conversion))
+                (with-file-modes (logand (default-file-modes) #o666)
+                  (write-region (point-min) (point-max) target-file nil 1)))
+              (or noninteractive (message "Wrote %s" target-file)))
+            (t
+             ;; This is just to give a better error message than write-region
+             (let ((exists (file-exists-p target-file)))
+               (signal (if exists 'file-error 'file-missing)
+                       (list "Opening output file"
+                             (if exists
+                                 "Cannot overwrite file"
+                               "Directory not writable or nonexistent")
+                             target-file))))))
          (kill-buffer (current-buffer)))
        (if (and byte-compile-generate-call-tree
                 (or (eq t byte-compile-generate-call-tree)
@@ -2238,12 +2236,12 @@ With argument ARG, insert value in current buffer after 
the form."
         (setq byte-compile-noruntime-functions nil)
         (setq byte-compile-new-defuns nil)
         (when byte-native-compiling
-          (defvar comp-speed)
-          (push `(comp-speed . ,comp-speed) byte-native-qualities)
-          (defvar comp-debug)
-          (push `(comp-debug . ,comp-debug) byte-native-qualities)
-          (defvar comp-native-driver-options)
-          (push `(comp-native-driver-options . ,comp-native-driver-options)
+          (defvar native-comp-speed)
+          (push `(native-comp-speed . ,native-comp-speed) 
byte-native-qualities)
+          (defvar native-comp-debug)
+          (push `(native-comp-debug . ,native-comp-debug) 
byte-native-qualities)
+          (defvar native-comp-driver-options)
+          (push `(native-comp-driver-options . ,native-comp-driver-options)
                 byte-native-qualities)
           (defvar no-native-compile)
           (push `(no-native-compile . ,no-native-compile)
@@ -5311,7 +5309,8 @@ already up-to-date."
   "Reload any Lisp file that was changed since Emacs was dumped.
 Use with caution."
   (let* ((argv0 (car command-line-args))
-         (emacs-file (or (cdr (nth 2 (pdumper-stats)))
+         (emacs-file (or (and (fboundp 'pdumper-stats)
+                              (cdr (nth 2 (pdumper-stats))))
                          (executable-find argv0))))
     (if (not (and emacs-file (file-exists-p emacs-file)))
         (message "Can't find %s to refresh preloaded Lisp files" argv0)
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 5afc6d3..0494497 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -203,7 +203,7 @@ Make sure the width/height is correct."
 
 (defclass chart-bar (chart)
   ((direction :initarg :direction
-             :initform vertical))
+             :initform 'vertical))
   "Subclass for bar charts (vertical or horizontal).")
 
 (cl-defmethod chart-draw ((c chart) &optional buff)
diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index eabba27..3840d13 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -847,7 +847,7 @@ PROPLIST is a list of the sort returned by `symbol-plist'.
               "\n")))
    "\n"))
 
-(defun cl--print-table (header rows)
+(defun cl--print-table (header rows &optional last-slot-on-next-line)
   ;; FIXME: Isn't this functionality already implemented elsewhere?
   (let ((cols (apply #'vector (mapcar #'string-width header)))
         (col-space 2))
@@ -877,7 +877,11 @@ PROPLIST is a list of the sort returned by `symbol-plist'.
                                header))
                 "\n")
         (dolist (row rows)
-          (insert (apply #'format format row) "\n"))))))
+          (insert (apply #'format format row) "\n")
+          (when last-slot-on-next-line
+            (dolist (line (string-lines (car (last row))))
+              (insert "    " line "\n"))
+            (insert "\n")))))))
 
 (defun cl--describe-class-slots (class)
   "Print help description for the slots in CLASS.
@@ -897,14 +901,13 @@ Outputs to the current buffer."
                (list (cl-prin1-to-string (cl--slot-descriptor-name slot))
                      (cl-prin1-to-string (cl--slot-descriptor-type slot))
                      (cl-prin1-to-string (cl--slot-descriptor-initform slot))
-                     (let ((doc (plist-get (cl--slot-descriptor-props slot)
-                                           :documentation)))
+                     (let ((doc (alist-get :documentation
+                                           (cl--slot-descriptor-props slot))))
                        (if (not doc) ""
                          (setq has-doc t)
                          (substitute-command-keys doc)))))
              slots)))
-      (cl--print-table `("Name" "Type" "Default" . ,(if has-doc '("Doc")))
-                       slots-strings))
+      (cl--print-table `("Name" "Type" "Default") slots-strings has-doc))
     (insert "\n")
     (when (> (length cslots) 0)
       (insert (propertize "\nClass Allocated Slots:\n\n" 'face 'bold))
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 31aa0cb..544704b 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -568,17 +568,17 @@ The set of acceptable TYPEs (also called 
\"specializers\") is defined
               (cons method mt)
             ;; Keep the ordering; important for methods with :extra qualifiers.
             (mapcar (lambda (x) (if (eq x (car me)) method x)) mt)))
-    (let ((sym (cl--generic-name generic))) ; Actual name (for aliases).
+    (let ((sym (cl--generic-name generic)) ; Actual name (for aliases).
+          ;; FIXME: Try to avoid re-constructing a new function if the old one
+          ;; is still valid (e.g. still empty method cache)?
+          (gfun (cl--generic-make-function generic)))
       (unless (symbol-function sym)
         (defalias sym 'dummy))   ;Record definition into load-history.
       (cl-pushnew `(cl-defmethod . ,(cl--generic-load-hist-format
                                      (cl--generic-name generic)
                                      qualifiers specializers))
                   current-load-list :test #'equal)
-      ;; FIXME: Try to avoid re-constructing a new function if the old one
-      ;; is still valid (e.g. still empty method cache)?
-      (let ((gfun (cl--generic-make-function generic))
-            ;; Prevent `defalias' from recording this as the definition site of
+      (let (;; Prevent `defalias' from recording this as the definition site of
             ;; the generic function.
             current-load-list
             ;; BEWARE!  Don't purify this function definition, since that leads
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index d7e6c30..cff4368 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -941,7 +941,8 @@ For more details, see Info node `(cl)Loop Facility'.
                                "above" "below" "by" "in" "on" "=" "across"
                                "repeat" "while" "until" "always" "never"
                                "thereis" "collect" "append" "nconc" "sum"
-                               "count" "maximize" "minimize" "if" "unless"
+                               "count" "maximize" "minimize"
+                               "if" "when" "unless"
                                "return"]
                           form]
                          ["using" (symbolp symbolp)]
@@ -1924,7 +1925,8 @@ from OBARRAY.
 
 \(fn (VAR [OBARRAY [RESULT]]) BODY...)"
   (declare (indent 1)
-           (debug ((symbolp &optional form form) cl-declarations body)))
+           (debug ((symbolp &optional form form) cl-declarations
+                   def-body)))
   ;; Apparently this doesn't have an implicit block.
   `(cl-block nil
      (let (,(car spec))
@@ -1964,7 +1966,7 @@ Each symbol in the first list is bound to the 
corresponding value in the
 second list (or to nil if VALUES is shorter than SYMBOLS); then the
 BODY forms are executed and their result is returned.  This is much like
 a `let' form, except that the list of symbols can be computed at run-time."
-  (declare (indent 2) (debug (form form body)))
+  (declare (indent 2) (debug (form form def-body)))
   (let ((bodyfun (make-symbol "body"))
         (binds (make-symbol "binds"))
         (syms (make-symbol "syms"))
@@ -3274,6 +3276,13 @@ STRUCT-TYPE is a symbol naming a struct type.  Return 
`record',
   (declare (side-effect-free t) (pure t))
   (cl--struct-class-type (cl--struct-get-class struct-type)))
 
+(defun cl--alist-to-plist (alist)
+  (let ((res '()))
+    (dolist (x alist)
+      (push (car x) res)
+      (push (cdr x) res))
+    (nreverse res)))
+
 (defun cl-struct-slot-info (struct-type)
   "Return a list of slot names of struct STRUCT-TYPE.
 Each entry is a list (SLOT-NAME . OPTS), where SLOT-NAME is a
@@ -3291,7 +3300,7 @@ slots skipped by :initial-offset may appear in the list."
                 ,(cl--slot-descriptor-initform slot)
                 ,@(if (not (eq (cl--slot-descriptor-type slot) t))
                       `(:type ,(cl--slot-descriptor-type slot)))
-                ,@(cl--slot-descriptor-props slot))
+                ,@(cl--alist-to-plist (cl--slot-descriptor-props slot)))
               descs)))
     (nreverse descs)))
 
diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el
index 7365e23..ef60b26 100644
--- a/lisp/emacs-lisp/cl-preloaded.el
+++ b/lisp/emacs-lisp/cl-preloaded.el
@@ -124,12 +124,11 @@ supertypes from the most specific to least specific.")
                             (get name 'cl-struct-print))
           (cl--find-class name)))))
 
-(defun cl--plist-remove (plist member)
-  (cond
-   ((null plist) nil)
-   ((null member) plist)
-   ((eq plist member) (cddr plist))
-   (t `(,(car plist) ,(cadr plist) ,@(cl--plist-remove (cddr plist) member)))))
+(defun cl--plist-to-alist (plist)
+  (let ((res '()))
+    (while plist
+      (push (cons (pop plist) (pop plist)) res))
+    (nreverse res)))
 
 (defun cl--struct-register-child (parent tag)
   ;; Can't use (cl-typep parent 'cl-structure-class) at this stage
@@ -164,12 +163,14 @@ supertypes from the most specific to least specific.")
                        (i 0)
                        (offset (if type 0 1)))
                    (dolist (slot slots)
-                     (let* ((props (cddr slot))
-                            (typep (plist-member props :type))
-                            (type (if typep (cadr typep) t)))
+                     (let* ((props (cl--plist-to-alist (cddr slot)))
+                            (typep (assq :type props))
+                            (type (if (null typep) t
+                                    (setq props (delq typep props))
+                                    (cdr typep))))
                        (aset v i (cl--make-slot-desc
                                   (car slot) (nth 1 slot)
-                                  type (cl--plist-remove props typep))))
+                                  type props)))
                      (puthash (car slot) (+ i offset) index-table)
                      (cl-incf i))
                    v))
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el
index 73b78a3..3c55782 100644
--- a/lisp/emacs-lisp/comp-cstr.el
+++ b/lisp/emacs-lisp/comp-cstr.el
@@ -190,13 +190,18 @@ Return them as multiple value."
 
 (defun comp-normalize-valset (valset)
   "Sort and remove duplicates from VALSET then return it."
-  (cl-remove-duplicates
-   (cl-sort valset (lambda (x y)
-                     ;; We might want to use `sxhash-eql' for speed but
-                     ;; this is safer to keep tests stable.
-                     (< (sxhash-equal x)
-                       (sxhash-equal y))))
-   :test #'eq))
+  (cl-sort (cl-remove-duplicates valset :test #'eq)
+           (lambda (x y)
+             (cond
+              ((and (symbolp x) (symbolp y))
+               (string< x y))
+              ((and (symbolp x) (not (symbolp y)))
+               t)
+              ((and (not (symbolp x)) (symbolp y))
+               nil)
+              (t
+               (< (sxhash-equal x)
+                  (sxhash-equal y)))))))
 
 (defun comp-union-valsets (&rest valsets)
   "Union values present into VALSETS."
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 0ebaccb..638d4b2 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -43,7 +43,7 @@
   "Emacs Lisp native compiler."
   :group 'lisp)
 
-(defcustom comp-speed 2
+(defcustom native-comp-speed 2
   "Optimization level for native compilation, a number between -1 and 3.
  -1 functions are kept in bytecode form and no native compilation is performed.
   0 native compilation is performed with no optimizations.
@@ -55,7 +55,7 @@
   :safe #'integerp
   :version "28.1")
 
-(defcustom comp-debug (if (eq 'windows-nt system-type) 1 0)
+(defcustom native-comp-debug (if (eq 'windows-nt system-type) 1 0)
   "Debug level for native compilation, a number between 0 and 3.
 This is intended for debugging the compiler itself.
   0 no debug output.
@@ -67,7 +67,7 @@ This is intended for debugging the compiler itself.
   :safe #'natnump
   :version "28.1")
 
-(defcustom comp-verbose 0
+(defcustom native-comp-verbose 0
   "Compiler verbosity for native compilation, a number between 0 and 3.
 This is intended for debugging the compiler itself.
   0 no logging.
@@ -78,19 +78,19 @@ This is intended for debugging the compiler itself.
   :risky t
   :version "28.1")
 
-(defcustom comp-always-compile nil
+(defcustom native-comp-always-compile nil
   "Non-nil means unconditionally (re-)compile all files."
   :type 'boolean
   :version "28.1")
 
-(defcustom comp-deferred-compilation-deny-list
+(defcustom native-comp-deferred-compilation-deny-list
   '()
   "List of regexps to exclude matching files from deferred native compilation.
 Files whose names match any regexp are excluded from native compilation."
   :type '(repeat regexp)
   :version "28.1")
 
-(defcustom comp-bootstrap-deny-list
+(defcustom native-comp-bootstrap-deny-list
   '()
   "List of regexps to exclude files from native compilation during bootstrap.
 Files whose names match any regexp are excluded from native compilation
@@ -98,7 +98,7 @@ during bootstrap."
   :type '(repeat regexp)
   :version "28.1")
 
-(defcustom comp-never-optimize-functions
+(defcustom native-comp-never-optimize-functions
   '(;; The following two are mandatory for Emacs to be working
     ;; correctly (see comment in `advice--add-function'). DO NOT
     ;; REMOVE.
@@ -107,7 +107,7 @@ during bootstrap."
   :type '(repeat symbol)
   :version "28.1")
 
-(defcustom comp-async-jobs-number 0
+(defcustom native-comp-async-jobs-number 0
   "Default number of subprocesses used for async native compilation.
 Value of zero means to use half the number of the CPU's execution units,
 or one if there's just one execution unit."
@@ -115,26 +115,26 @@ or one if there's just one execution unit."
   :risky t
   :version "28.1")
 
-(defcustom comp-async-cu-done-functions nil
+(defcustom native-comp-async-cu-done-functions nil
   "List of functions to call after asynchronously compiling one compilation 
unit.
 Called with one argument FILE, the filename used as input to
 compilation."
   :type 'hook
   :version "28.1")
 
-(defcustom comp-async-all-done-hook nil
+(defcustom native-comp-async-all-done-hook nil
   "Hook run after completing asynchronous compilation of all input files."
   :type 'hook
   :version "28.1")
 
-(defcustom comp-async-env-modifier-form nil
+(defcustom native-comp-async-env-modifier-form nil
   "Form evaluated before compilation by each asynchronous compilation 
subprocess.
 Used to modify the compiler environment."
   :type 'sexp
   :risky t
   :version "28.1")
 
-(defcustom comp-async-report-warnings-errors t
+(defcustom native-comp-async-report-warnings-errors t
   "Whether to report warnings and errors from asynchronous native compilation.
 
 When native compilation happens asynchronously, it can produce
@@ -148,11 +148,16 @@ As asynchronous native compilation always starts from a 
pristine
 environment, it is more sensitive to such omissions, and might be
 unable to compile such Lisp source files correctly.
 
-Set this variable to nil if these warnings annoy you."
-  :type 'boolean
+Set this variable to nil to suppress warnings altogether, or to
+the symbol `silent' to log warnings but not pop up the *Warnings*
+buffer."
+  :type '(choice
+          (const :tag "Do not report warnings" nil)
+          (const :tag "Report and display warnings" t)
+          (const :tag "Report but do not display warnings" silent))
   :version "28.1")
 
-(defcustom comp-async-query-on-exit nil
+(defcustom native-comp-async-query-on-exit nil
   "Whether to query the user about killing async compilations when exiting.
 If this is non-nil, Emacs will ask for confirmation to exit and kill the
 asynchronous native compilations if any are running.  If nil, when you
@@ -161,7 +166,7 @@ if `confirm-kill-processes' is non-nil."
   :type 'boolean
   :version "28.1")
 
-(defcustom comp-native-driver-options nil
+(defcustom native-comp-driver-options nil
   "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
@@ -178,7 +183,7 @@ the .eln output directory."
   :type 'boolean
   :version "28.1")
 
-(defcustom comp-warning-on-missing-source t
+(defcustom native-comp-warning-on-missing-source t
   "Emit a warning if a byte-code file being loaded has no corresponding source.
 The source file is necessary for native code file look-up and deferred
 compilation mechanism."
@@ -195,6 +200,9 @@ Emacs Lisp file:
 \;; Local Variables:\n;; no-native-compile: t\n;; End:")
 ;;;###autoload(put 'no-native-compile 'safe-local-variable 'booleanp)
 
+(defvar native-compile-target-directory nil
+  "When non-nil force the target directory for the eln files being compiled.")
+
 (defvar comp-log-time-report nil
   "If non-nil, log a time report for each pass.")
 
@@ -662,7 +670,7 @@ Useful to hook into pass checkers.")
 (defun comp-subr-trampoline-install (subr-name)
   "Make SUBR-NAME effectively advice-able when called from native code."
   (unless (or (null comp-enable-subr-trampolines)
-              (memq subr-name comp-never-optimize-functions)
+              (memq subr-name native-comp-never-optimize-functions)
               (gethash subr-name comp-installed-trampolines-h))
     (cl-assert (subr-primitive-p (symbol-function subr-name)))
     (comp--install-trampoline
@@ -743,11 +751,11 @@ Returns ELT."
   "Lisp side of the compiler context."
   (output nil :type string
           :documentation "Target output file-name for the compilation.")
-  (speed comp-speed :type number
+  (speed native-comp-speed :type number
          :documentation "Default speed for this compilation unit.")
-  (debug comp-debug :type number
+  (debug native-comp-debug :type number
          :documentation "Default debug level for this compilation unit.")
-  (driver-options comp-native-driver-options :type list
+  (driver-options native-comp-driver-options :type list
          :documentation "Options for the GCC driver.")
   (top-level-forms () :type list
                    :documentation "List of spilled top level forms.")
@@ -899,7 +907,7 @@ CFG is mutated by a pass.")
   (has-non-local nil :type boolean
                  :documentation "t if non local jumps are present.")
   (speed nil :type number
-         :documentation "Optimization level (see `comp-speed').")
+         :documentation "Optimization level (see `native-comp-speed').")
   (pure nil :type boolean
         :documentation "t if pure nil otherwise.")
   (type nil :type (or null comp-mvar)
@@ -938,7 +946,7 @@ In use by the back-end."
 Signal an error otherwise.
 To be used by all entry points."
   (cond
-   ((null (featurep 'nativecomp))
+   ((null (featurep 'native-compile))
     (error "Emacs was not compiled with native compiler support 
(--with-native-compilation)"))
    ((null (native-comp-available-p))
     (error "Cannot find libgccjit library"))))
@@ -1028,18 +1036,18 @@ Assume allocation class 'd-default as default."
     (,(rx-to-string
        `(seq "(" (group-n 1 (or ,@(mapcar #'symbol-name comp-limple-ops)))))
      (1 font-lock-keyword-face)))
-  "Highlights used by `comp-limple-mode'.")
+  "Highlights used by `native-comp-limple-mode'.")
 
-(define-derived-mode comp-limple-mode fundamental-mode "LIMPLE"
+(define-derived-mode native-comp-limple-mode fundamental-mode "LIMPLE"
   "Syntax-highlight LIMPLE IR."
   (setf font-lock-defaults '(comp-limple-lock-keywords)))
 
 (cl-defun comp-log (data &optional (level 1) quoted)
   "Log DATA at LEVEL.
 LEVEL is a number from 1-3, and defaults to 1; if it is less
-than `comp-verbose', do nothing.  If `noninteractive', log
+than `native-comp-verbose', do nothing.  If `noninteractive', log
 with `message'.  Otherwise, log with `comp-log-to-buffer'."
-  (when (>= comp-verbose level)
+  (when (>= native-comp-verbose level)
     (if noninteractive
         (cl-typecase data
           (atom (message "%s" data))
@@ -1059,8 +1067,8 @@ with `message'.  Otherwise, log with 
`comp-log-to-buffer'."
          (inhibit-read-only t)
          at-end-p)
     (with-current-buffer log-buffer
-      (unless (eq major-mode 'comp-limple-mode)
-        (comp-limple-mode))
+      (unless (eq major-mode 'native-comp-limple-mode)
+        (native-comp-limple-mode))
       (when (= (point) (point-max))
         (setf at-end-p t))
       (save-excursion
@@ -1091,7 +1099,7 @@ with `message'.  Otherwise, log with 
`comp-log-to-buffer'."
 (defun comp-log-func (func verbosity)
   "Log function FUNC at VERBOSITY.
 VERBOSITY is a number between 0 and 3."
-  (when (>= comp-verbose verbosity)
+  (when (>= native-comp-verbose verbosity)
     (comp-log (format "\nFunction: %s\n" (comp-func-name func)) verbosity)
     (cl-loop
      for block-name being each hash-keys of (comp-func-blocks func)
@@ -1332,13 +1340,14 @@ clashes."
   (unless (comp-ctxt-output comp-ctxt)
     (setf (comp-ctxt-output comp-ctxt) (comp-el-to-eln-filename
                                         filename
-                                        (when byte-native-for-bootstrap
-                                          (car (last comp-eln-load-path))))))
-  (setf (comp-ctxt-speed comp-ctxt) (alist-get 'comp-speed
+                                        (or native-compile-target-directory
+                                            (when byte+native-compile
+                                              (car (last 
native-comp-eln-load-path)))))))
+  (setf (comp-ctxt-speed comp-ctxt) (alist-get 'native-comp-speed
                                                byte-native-qualities)
-        (comp-ctxt-debug comp-ctxt) (alist-get 'comp-debug
+        (comp-ctxt-debug comp-ctxt) (alist-get 'native-comp-debug
                                                byte-native-qualities)
-        (comp-ctxt-driver-options comp-ctxt) (alist-get 
'comp-native-driver-options
+        (comp-ctxt-driver-options comp-ctxt) (alist-get 
'native-comp-driver-options
                                                         byte-native-qualities)
         (comp-ctxt-top-level-forms comp-ctxt)
         (cl-loop
@@ -3250,14 +3259,14 @@ Return t if something was changed."
 ;;   funcall trampoline gets optimized into normal indirect calls.
 ;;   This makes effectively this calls equivalent to all the subrs that got
 ;;   dedicated byte-code ops.
-;;   Triggered at comp-speed >= 2.
+;;   Triggered at native-comp-speed >= 2.
 ;; - Recursive calls gets optimized into direct calls.
-;;   Triggered at comp-speed >= 2.
+;;   Triggered at native-comp-speed >= 2.
 ;; - Intra compilation unit procedure calls gets optimized into direct calls.
 ;;   This can be a big win and even allow gcc to inline but does not make
 ;;   function in the compilation unit re-definable safely without recompiling
 ;;   the full compilation unit.
-;;   For this reason this is triggered only at comp-speed == 3.
+;;   For this reason this is triggered only at native-comp-speed == 3.
 
 (defun comp-func-in-unit (func)
   "Given FUNC return the `comp-fun' definition in the current context.
@@ -3275,7 +3284,7 @@ FUNCTION can be a function-name or byte compiled 
function."
     (when (and callee
                (or (symbolp callee)
                    (gethash callee (comp-ctxt-byte-func-to-func-h comp-ctxt)))
-               (not (memq callee comp-never-optimize-functions)))
+               (not (memq callee native-comp-never-optimize-functions)))
       (let* ((f (if (symbolp callee)
                     (symbol-function callee)
                   (cl-assert (byte-code-function-p callee))
@@ -3638,7 +3647,7 @@ Prepare every function for final compilation and drive 
the C back-end."
     ;; unless during bootstrap or async compilation (bug#45056).  GCC
     ;; leaks memory but also interfere with the ability of Emacs to
     ;; detect when a sub-process completes (TODO understand why).
-    (if (or byte-native-for-bootstrap comp-async-compilation)
+    (if (or byte+native-compile comp-async-compilation)
        (comp-final1)
       ;; Call comp-final1 in a child process.
       (let* ((output (comp-ctxt-output comp-ctxt))
@@ -3650,14 +3659,14 @@ Prepare every function for final compilation and drive 
the C back-end."
              (print-circle t)
              (print-escape-multibyte t)
              (expr `((require 'comp)
-                     (setf comp-verbose ,comp-verbose
+                     (setf native-comp-verbose ,native-comp-verbose
                            comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                            comp-ctxt ,comp-ctxt
-                           comp-eln-load-path ',comp-eln-load-path
-                           comp-native-driver-options
-                           ',comp-native-driver-options
+                           native-comp-eln-load-path 
',native-comp-eln-load-path
+                           native-comp-driver-options
+                           ',native-comp-driver-options
                            load-path ',load-path)
-                     ,comp-async-env-modifier-form
+                     ,native-comp-async-env-modifier-form
                      (message "Compiling %s..." ',output)
                      (comp-final1)))
              (temp-file (make-temp-file
@@ -3703,12 +3712,12 @@ Prepare every function for final compilation and drive 
the C back-end."
 
 (defun comp-eln-load-path-eff ()
   "Return a list of effective eln load directories.
-Account for `comp-eln-load-path' and `comp-native-version-dir'."
+Account for `native-comp-eln-load-path' and `comp-native-version-dir'."
   (mapcar (lambda (dir)
             (expand-file-name comp-native-version-dir
                               (file-name-as-directory
                                (expand-file-name dir invocation-directory))))
-          comp-eln-load-path))
+          native-comp-eln-load-path))
 
 (defun comp-trampoline-filename (subr-name)
   "Given SUBR-NAME return the filename containing the trampoline."
@@ -3756,7 +3765,7 @@ Return the trampoline if found or nil otherwise."
          ;; Use speed 0 to maximize compilation speed and not to
          ;; optimize away funcall calls!
          (byte-optimize nil)
-         (comp-speed 1)
+         (native-comp-speed 1)
          (lexical-binding t))
     (comp--native-compile
      form nil
@@ -3772,14 +3781,14 @@ Return the trampoline if found or nil otherwise."
       when (file-writable-p f)
         do (cl-return f)
       finally (error "Cannot find suitable directory for output in \
-`comp-eln-load-path'")))))
+`native-comp-eln-load-path'")))))
 
 
 ;; Some entry point support code.
 
 ;;;###autoload
 (defun comp-clean-up-stale-eln (file)
-  "Given FILE remove all its *.eln files in `comp-eln-load-path'
+  "Given FILE remove all its *.eln files in `native-comp-eln-load-path'
 sharing the original source filename (including FILE)."
   (when (string-match (rx "-" (group-n 1 (1+ hex)) "-" (1+ hex) ".eln" eos)
                       file)
@@ -3851,7 +3860,7 @@ processes from `comp-async-compilations'"
 (defvar comp-num-cpus nil)
 (defun comp-effective-async-max-jobs ()
   "Compute the effective number of async jobs."
-  (if (zerop comp-async-jobs-number)
+  (if (zerop native-comp-async-jobs-number)
       (or comp-num-cpus
           (setf comp-num-cpus
                 ;; FIXME: we already have a function to determine
@@ -3867,26 +3876,30 @@ processes from `comp-async-compilations'"
                                   (shell-command-to-string "sysctl -n 
hw.ncpu")))
                                 (t 1))
                           2))))
-    comp-async-jobs-number))
+    native-comp-async-jobs-number))
 
 (defvar comp-last-scanned-async-output nil)
 (make-variable-buffer-local 'comp-last-scanned-async-output)
 (defun comp-accept-and-process-async-output (process)
   "Accept PROCESS output and check for diagnostic messages."
-  (if comp-async-report-warnings-errors
-      (with-current-buffer (process-buffer process)
-        (save-excursion
-          (accept-process-output process)
-          (goto-char (or comp-last-scanned-async-output (point-min)))
-          (while (re-search-forward "^.*?\\(?:Error\\|Warning\\): .*$"
-                                    nil t)
-            (display-warning 'comp (match-string 0)))
-          (setq comp-last-scanned-async-output (point-max))))
+  (if native-comp-async-report-warnings-errors
+      (let ((warning-suppress-types
+             (if (eq native-comp-async-report-warnings-errors 'silent)
+                 (cons '(comp) warning-suppress-types)
+               warning-suppress-types)))
+        (with-current-buffer (process-buffer process)
+          (save-excursion
+            (accept-process-output process)
+            (goto-char (or comp-last-scanned-async-output (point-min)))
+            (while (re-search-forward "^.*?\\(?:Error\\|Warning\\): .*$"
+                                      nil t)
+              (display-warning 'comp (match-string 0)))
+            (setq comp-last-scanned-async-output (point-max)))))
     (accept-process-output process)))
 
 (defun comp-run-async-workers ()
   "Start compiling files from `comp-files-queue' asynchronously.
-When compilation is finished, run `comp-async-all-done-hook' and
+When compilation is finished, run `native-comp-async-all-done-hook' and
 display a message."
   (if (or comp-files-queue
           (> (comp-async-runnings) 0))
@@ -3897,7 +3910,7 @@ display a message."
          do (cl-assert (string-match-p comp-valid-source-re source-file) nil
                        "`comp-files-queue' should be \".el\" files: %s"
                        source-file)
-         when (or comp-always-compile
+         when (or native-comp-always-compile
                   load ; Always compile when the compilation is
                        ; commanded for late load.
                   (file-newer-than-file-p
@@ -3905,17 +3918,17 @@ display a message."
          do (let* ((expr `((require 'comp)
                            ,(when (boundp 'backtrace-line-length)
                               `(setf backtrace-line-length 
,backtrace-line-length))
-                           (setf comp-speed ,comp-speed
-                                 comp-debug ,comp-debug
-                                 comp-verbose ,comp-verbose
+                           (setf native-comp-speed ,native-comp-speed
+                                 native-comp-debug ,native-comp-debug
+                                 native-comp-verbose ,native-comp-verbose
                                  comp-libgccjit-reproducer 
,comp-libgccjit-reproducer
                                  comp-async-compilation t
-                                 comp-eln-load-path ',comp-eln-load-path
-                                 comp-native-driver-options
-                                 ',comp-native-driver-options
+                                 native-comp-eln-load-path 
',native-comp-eln-load-path
+                                 native-comp-driver-options
+                                 ',native-comp-driver-options
                                  load-path ',load-path
                                  warning-fill-column most-positive-fixnum)
-                           ,comp-async-env-modifier-form
+                           ,native-comp-async-env-modifier-form
                            (message "Compiling %s..." ,source-file)
                            (comp--native-compile ,source-file ,(and load t))))
                    (source-file1 source-file) ;; Make the closure works :/
@@ -3932,7 +3945,11 @@ display a message."
                    (load1 load)
                    (process (make-process
                              :name (concat "Compiling: " source-file)
-                             :buffer (get-buffer-create comp-async-buffer-name)
+                             :buffer (with-current-buffer
+                                         (get-buffer-create
+                                          comp-async-buffer-name)
+                                       (setf buffer-read-only t)
+                                      (current-buffer))
                              :command (list
                                        (expand-file-name invocation-name
                                                          invocation-directory)
@@ -3940,26 +3957,30 @@ display a message."
                              :sentinel
                              (lambda (process _event)
                                (run-hook-with-args
-                                'comp-async-cu-done-functions
+                                'native-comp-async-cu-done-functions
                                 source-file)
                                (comp-accept-and-process-async-output process)
                                (ignore-errors (delete-file temp-file))
-                               (when (and load1
-                                          (zerop (process-exit-status 
process)))
-                                 (native-elisp-load
-                                  (comp-el-to-eln-filename source-file1)
-                                  (eq load1 'late)))
+                               (let ((eln-file (comp-el-to-eln-filename
+                                                source-file1)))
+                                 (when (and load1
+                                            (zerop (process-exit-status
+                                                    process))
+                                            (file-exists-p eln-file))
+                                   (native-elisp-load eln-file
+                                                      (eq load1 'late))))
                                (comp-run-async-workers))
-                             :noquery (not comp-async-query-on-exit))))
+                             :noquery (not native-comp-async-query-on-exit))))
               (puthash source-file process comp-async-compilations))
          when (>= (comp-async-runnings) (comp-effective-async-max-jobs))
            do (cl-return)))
     ;; No files left to compile and all processes finished.
-    (run-hooks 'comp-async-all-done-hook)
+    (run-hooks 'native-comp-async-all-done-hook)
     (with-current-buffer (get-buffer-create comp-async-buffer-name)
       (save-excursion
-        (goto-char (point-max))
-        (insert "Compilation finished.\n")))
+        (let ((buffer-read-only nil))
+          (goto-char (point-max))
+          (insert "Compilation finished.\n"))))
     ;; `comp-deferred-pending-h' should be empty at this stage.
     ;; Reset it anyway.
     (clrhash comp-deferred-pending-h)))
@@ -4041,11 +4062,11 @@ LOAD and SELECTOR work as described in 
`native--compile-async'."
        (t (error "SELECTOR must be a function a regexp or nil")))
       ;; Also exclude files from deferred compilation if
       ;; any of the regexps in
-      ;; `comp-deferred-compilation-deny-list' matches.
+      ;; `native-comp-deferred-compilation-deny-list' matches.
       (and (eq load 'late)
            (cl-some (lambda (re)
                       (string-match-p re file))
-                    comp-deferred-compilation-deny-list))))
+                    native-comp-deferred-compilation-deny-list))))
 
 (defun native--compile-async (files &optional recursively load selector)
   "Compile FILES asynchronously.
@@ -4063,7 +4084,7 @@ nil -- Select all files.
 a string -- A regular expression selecting files with matching names.
 a function -- A function selecting files with matching names.
 
-The variable `comp-async-jobs-number' specifies the number
+The variable `native-comp-async-jobs-number' specifies the number
 of (commands) to run simultaneously.
 
 LOAD can also be the symbol `late'.  This is used internally if
@@ -4120,10 +4141,10 @@ bytecode definition was not changed in the meantime)."
 ;;;###autoload
 (defun comp-lookup-eln (filename)
   "Given a Lisp source FILENAME return the corresponding .eln file if found.
-Search happens in `comp-eln-load-path'."
+Search happens in `native-comp-eln-load-path'."
   (cl-loop
    with eln-filename = (comp-el-to-eln-rel-filename filename)
-   for dir in comp-eln-load-path
+   for dir in native-comp-eln-load-path
    for f = (expand-file-name eln-filename
                              (expand-file-name comp-native-version-dir
                                                (expand-file-name
@@ -4154,26 +4175,26 @@ it won’t work in an interactive Emacs.
 Native compilation equivalent to `batch-byte-compile'."
   (comp-ensure-native-compiler)
   (cl-loop for file in command-line-args-left
-           if (or (null byte-native-for-bootstrap)
+           if (or (null byte+native-compile)
                   (cl-notany (lambda (re) (string-match re file))
-                             comp-bootstrap-deny-list))
+                             native-comp-bootstrap-deny-list))
            do (comp--native-compile file)
            else
            do (byte-compile-file file)))
 
 ;;;###autoload
-(defun batch-byte-native-compile-for-bootstrap ()
+(defun batch-byte+native-compile ()
   "Like `batch-native-compile', but used for bootstrap.
 Generate .elc files in addition to the .eln files.
 Force the produced .eln to be outputted in the eln system
-directory (the last entry in `comp-eln-load-path').
-If the environment variable 'NATIVE_DISABLED' is set, only byte
-compile."
+directory (the last entry in `native-comp-eln-load-path') unless
+`native-compile-target-directory' is non-nil.  If the environment
+variable 'NATIVE_DISABLED' is set, only byte compile."
   (comp-ensure-native-compiler)
   (if (equal (getenv "NATIVE_DISABLED") "1")
       (batch-byte-compile)
     (cl-assert (length= command-line-args-left 1))
-    (let ((byte-native-for-bootstrap t)
+    (let ((byte+native-compile t)
           (byte-to-native-output-file nil))
       (batch-native-compile)
       (pcase byte-to-native-output-file
@@ -4197,7 +4218,7 @@ nil -- Select all files.
 a string -- A regular expression selecting files with matching names.
 a function -- A function selecting files with matching names.
 
-The variable `comp-async-jobs-number' specifies the number
+The variable `native-comp-async-jobs-number' specifies the number
 of (commands) to run simultaneously."
   ;; Normalize: we only want to pass t or nil, never e.g. `late'.
   (let ((load (not (not load))))
diff --git a/lisp/emacs-lisp/copyright.el b/lisp/emacs-lisp/copyright.el
index a9baef3..6ba2e78 100644
--- a/lisp/emacs-lisp/copyright.el
+++ b/lisp/emacs-lisp/copyright.el
@@ -51,7 +51,7 @@ This is useful for ChangeLogs."
  "\\(©\\|@copyright{}\\|[Cc]opyright\\s *:?\\s *\\(?:(C)\\)?\
 \\|[Cc]opyright\\s *:?\\s *©\\)\
 \\s *[^0-9\n]*\\s *\
-\\([1-9]\\([-0-9, ';/*%#\n\t]\\|\\s<\\|\\s>\\)*[0-9]+\\)"
+\\([1-9]\\([-0-9, ';/*%#\n\t–]\\|\\s<\\|\\s>\\)*[0-9]+\\)"
   "What your copyright notice looks like.
 The second \\( \\) construct must match the years."
   :type 'regexp)
@@ -69,7 +69,7 @@ someone else or to a group for which you do not work."
 ;;;###autoload(put 'copyright-names-regexp 'safe-local-variable 'stringp)
 
 (defcustom copyright-years-regexp
- "\\(\\s *\\)\\([1-9]\\([-0-9, ';/*%#\n\t]\\|\\s<\\|\\s>\\)*[0-9]+\\)"
+  "\\(\\s *\\)\\([1-9]\\([-0-9, ';/*%#\n\t–]\\|\\s<\\|\\s>\\)*[0-9]+\\)"
   "Match additional copyright notice years.
 The second \\( \\) construct must match the years."
   :type 'regexp)
@@ -197,8 +197,8 @@ skips to the end of all the years."
                                                  (point))))
                            100)
                         1)
-                    (or (eq (char-after (+ (point) size -1)) ?-)
-                        (eq (char-after (+ (point) size -2)) ?-)))
+                    (or (memq (char-after (+ (point) size -1)) '(?- ?–))
+                        (memq (char-after (+ (point) size -2)) '(?- ?–))))
                ;; This is a range so just replace the end part.
                (delete-char size)
              ;; Insert a comma with the preferred number of spaces.
@@ -287,7 +287,7 @@ independently replaces consecutive years with a range."
          (setq year (string-to-number (match-string 0)))
          (and (setq sep (char-before))
               (/= (char-syntax sep) ?\s)
-              (/= sep ?-)
+              (not (memq sep '(?- ?–)))
               (insert " "))
          (when (< year 100)
            (insert (if (>= year 50) "19" "20"))
@@ -297,7 +297,7 @@ independently replaces consecutive years with a range."
            ;; If the previous thing was a range, don't try to tack more on.
            ;; Ie not 2000-2005 -> 2000-2005-2007
            ;; TODO should merge into existing range if possible.
-           (if (eq sep ?-)
+           (if (memq sep '(?- ?–))
                (setq prev-year nil
                      year nil)
              (if (and prev-year (= year (1+ prev-year)))
@@ -306,7 +306,7 @@ independently replaces consecutive years with a range."
                           (> prev-year first-year))
                  (goto-char range-end)
                  (delete-region range-start range-end)
-                 (insert (format "-%d" prev-year))
+                 (insert (format "%c%d" sep prev-year))
                  (goto-char p))
                (setq first-year year
                      range-start (point)))))
diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el
index e106815..d24ea35 100644
--- a/lisp/emacs-lisp/crm.el
+++ b/lisp/emacs-lisp/crm.el
@@ -183,8 +183,7 @@ Return t if the current element is now a valid match; 
otherwise return nil."
 Like `minibuffer-complete-word' but for `completing-read-multiple'."
   (interactive)
   (crm--completion-command beg end
-    (completion-in-region--single-word
-     beg end minibuffer-completion-table minibuffer-completion-predicate)))
+    (completion-in-region--single-word beg end)))
 
 (defun crm-complete-and-exit ()
   "If all of the minibuffer elements are valid completions then exit.
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 0a6d4ec..3a00fdb 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -84,18 +84,22 @@ replacing its case-insensitive matches with the literal 
string in LIGHTER."
 (defconst easy-mmode--arg-docstring
   "
 
-If called interactively, toggle `%s'.  If the prefix argument is
-positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `%s'
+mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.
 Enable the mode if ARG is nil, omitted, or is a positive number.
 Disable the mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `%S'.
+
 The mode's hook is called both when the mode is enabled and when
 it is disabled.")
 
-(defun easy-mmode--mode-docstring (doc mode-pretty-name keymap-sym)
+(defun easy-mmode--mode-docstring (doc mode-pretty-name keymap-sym
+                                       getter)
   (let ((doc (or doc (format "Toggle %s on or off.
 
 \\{%s}" mode-pretty-name keymap-sym))))
@@ -104,7 +108,8 @@ it is disabled.")
       (let* ((fill-prefix nil)
              (docs-fc (bound-and-true-p emacs-lisp-docstring-fill-column))
              (fill-column (if (integerp docs-fc) docs-fc 65))
-             (argdoc (format easy-mmode--arg-docstring mode-pretty-name))
+             (argdoc (format easy-mmode--arg-docstring mode-pretty-name
+                             getter))
              (filled (if (fboundp 'fill-region)
                          (with-temp-buffer
                            (insert argdoc)
@@ -308,7 +313,8 @@ or call the function `%s'."))))
        ,(funcall
          warnwrap
          `(defun ,modefun (&optional arg ,@extra-args)
-            ,(easy-mmode--mode-docstring doc pretty-name keymap-sym)
+            ,(easy-mmode--mode-docstring doc pretty-name keymap-sym
+                                         getter)
             ,(when interactive
               ;; Use `toggle' rather than (if ,mode 0 1) so that using
               ;; repeat-command still does the toggling correctly.
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index b08ee3c..2aec819 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -88,6 +88,7 @@ using, but only when you also use Edebug."
 ;; because the byte compiler binds them; as a result, if edebug
 ;; is first loaded for a require in a compilation, they will be left unbound.
 
+;;;###autoload
 (defcustom edebug-all-defs nil
   "If non-nil, evaluating defining forms instruments for Edebug.
 This applies to `eval-defun', `eval-region', `eval-buffer', and
@@ -100,6 +101,7 @@ variable.  You may wish to make it local to each buffer with
 `emacs-lisp-mode-hook'."
   :type 'boolean)
 
+;;;###autoload
 (defcustom edebug-all-forms nil
   "Non-nil means evaluation of all forms will instrument for Edebug.
 This doesn't apply to loading or evaluations in the minibuffer.
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el
index 641882c..ec7c899 100644
--- a/lisp/emacs-lisp/eieio-base.el
+++ b/lisp/emacs-lisp/eieio-base.el
@@ -156,7 +156,7 @@ only one object ever exists."
   ;; NOTE TO SELF: In next version, make `slot-boundp' support classes
   ;; with class allocated slots or default values.
   (let ((old (oref-default class singleton)))
-    (if (eq old eieio-unbound)
+    (if (eq old eieio--unbound)
        (oset-default class singleton (cl-call-next-method))
       old)))
 
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index 2923dff..8f1e38b 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -71,11 +71,10 @@ Currently under control of this var:
 - Define <class>-child-p and <class>-list-p predicates.
 - Allow object names in constructors.")
 
-(defconst eieio-unbound
-  (if (and (boundp 'eieio-unbound) (symbolp eieio-unbound))
-      eieio-unbound
-    (make-symbol "unbound"))
+(define-obsolete-variable-alias 'eieio-unbound 'eieio--unbound "28.1")
+(defvar eieio--unbound (make-symbol "eieio--unbound")
   "Uninterned symbol representing an unbound slot in an object.")
+(defvar eieio--unbound-form (macroexp-quote eieio--unbound))
 
 ;; This is a bootstrap for eieio-default-superclass so it has a value
 ;; while it is being built itself.
@@ -264,6 +263,7 @@ use \\='%s or turn off `eieio-backward-compatibility' 
instead" cname)
          (object-of-class-p obj class))))
 
 (defvar eieio--known-slot-names nil)
+(defvar eieio--known-class-slot-names nil)
 
 (defun eieio-defclass-internal (cname superclasses slots options)
   "Define CNAME as a new subclass of SUPERCLASSES.
@@ -347,19 +347,20 @@ See `defclass' for more information."
     (when eieio-backward-compatibility
       (let ((csym (intern (concat (symbol-name cname) "-list-p"))))
         (defalias csym
-              `(lambda (obj)
-                 ,(format
-                   "Test OBJ to see if it a list of objects which are a child 
of type %s"
-                   cname)
-                 (when (listp obj)
-                   (let ((ans t)) ;; nil is valid
-                     ;; Loop over all the elements of the input list, test
-                     ;; each to make sure it is a child of the desired object 
class.
-                     (while (and obj ans)
-                       (setq ans (and (eieio-object-p (car obj))
-                                      (object-of-class-p (car obj) ,cname)))
-                       (setq obj (cdr obj)))
-                     ans))))
+          (lambda (obj)
+            (:documentation
+             (format
+              "Test OBJ to see if it a list of objects which are a child of 
type %s"
+              cname))
+            (when (listp obj)
+              (let ((ans t)) ;; nil is valid
+                ;; Loop over all the elements of the input list, test
+                ;; each to make sure it is a child of the desired object class.
+                (while (and obj ans)
+                  (setq ans (and (eieio-object-p (car obj))
+                                 (object-of-class-p (car obj) 'cname)))
+                  (setq obj (cdr obj)))
+                ans))))
         (make-obsolete csym (format
                              "use (cl-typep ... \\='(list-of %s)) instead"
                              cname)
@@ -380,7 +381,7 @@ See `defclass' for more information."
     (pcase-dolist (`(,name . ,slot) slots)
       (let* ((init    (or (plist-get slot :initform)
                          (if (member :initform slot) nil
-                           eieio-unbound)))
+                           eieio--unbound-form)))
             (initarg (plist-get slot :initarg))
             (docstr  (plist-get slot :documentation))
             (prot    (plist-get slot :protection))
@@ -394,6 +395,14 @@ See `defclass' for more information."
             (skip-nil (eieio--class-option-assoc options :allow-nil-initform))
             )
 
+        (unless (or (macroexp-const-p init)
+                    (eieio--eval-default-p init))
+          ;; FIXME: We duplicate this test here and in `defclass' because
+          ;; if we move this part to `defclass' we may break some existing
+          ;; code (because the `fboundp' test in `eieio--eval-default-p'
+          ;; returns a different result at compile time).
+          (setq init (macroexp-quote init)))
+
        ;; Clean up the meaning of protection.
         (setq prot
               (pcase prot
@@ -456,8 +465,9 @@ See `defclass' for more information."
            (n (length slots))
            (v (make-vector n nil)))
       (dotimes (i n)
-        (setf (aref v i) (eieio-default-eval-maybe
-                          (cl--slot-descriptor-initform (aref slots i)))))
+        (setf (aref v i) (eval
+                          (cl--slot-descriptor-initform (aref slots i))
+                          t)))
       (setf (eieio--class-class-allocation-values newc) v))
 
     ;; Attach slot symbols into a hash table, and store the index of
@@ -512,7 +522,7 @@ See `defclass' for more information."
     cname
     ))
 
-(defsubst eieio-eval-default-p (val)
+(defun eieio--eval-default-p (val)
   "Whether the default value VAL should be evaluated for use."
   (and (consp val) (symbolp (car val)) (fboundp (car val))))
 
@@ -521,10 +531,10 @@ See `defclass' for more information."
 If SKIPNIL is non-nil, then if default value is nil return t instead."
   (let ((value (cl--slot-descriptor-initform slot))
         (spec (cl--slot-descriptor-type slot)))
-    (if (not (or (eieio-eval-default-p value) ;FIXME: Why?
+    (if (not (or (not (macroexp-const-p value))
                  eieio-skip-typecheck
                  (and skipnil (null value))
-                 (eieio--perform-slot-validation spec value)))
+                 (eieio--perform-slot-validation spec (eval value t))))
         (signal 'invalid-slot-type (list (cl--slot-descriptor-name slot) spec 
value)))))
 
 (defun eieio--slot-override (old new skipnil)
@@ -545,7 +555,7 @@ If SKIPNIL is non-nil, then if default value is nil return 
t instead."
              type tp a))
       (setf (cl--slot-descriptor-type new) tp))
     ;; If we have a repeat, only update the initarg...
-    (unless (eq d eieio-unbound)
+    (unless (eq d eieio--unbound-form)
       (eieio--perform-slot-validation-for-default new skipnil)
       (setf (cl--slot-descriptor-initform old) d))
 
@@ -603,6 +613,8 @@ if default value is nil."
          (cold (car (cl-member a (eieio--class-class-slots newc)
                                :key #'cl--slot-descriptor-name))))
     (cl-pushnew a eieio--known-slot-names)
+    (when (eq alloc :class)
+      (cl-pushnew a eieio--known-class-slot-names))
     (condition-case nil
         (if (sequencep d) (setq d (copy-sequence d)))
       ;; This copy can fail on a cons cell with a non-cons in the cdr.  Let's
@@ -678,7 +690,7 @@ the new child class."
 (defun eieio--perform-slot-validation (spec value)
   "Return non-nil if SPEC does not match VALUE."
   (or (eq spec t)                      ; t always passes
-      (eq value eieio-unbound)         ; unbound always passes
+      (eq value eieio--unbound)                ; unbound always passes
       (cl-typep value spec)))
 
 (defun eieio--validate-slot-value (class slot-idx value slot)
@@ -714,7 +726,7 @@ an error."
 INSTANCE is the object being referenced.  SLOTNAME is the offending
 slot.  If the slot is ok, return VALUE.
 Argument FN is the function calling this verifier."
-  (if (and (eq value eieio-unbound) (not eieio-skip-typecheck))
+  (if (and (eq value eieio--unbound) (not eieio-skip-typecheck))
       (slot-unbound instance (eieio--object-class instance) slotname fn)
     value))
 
@@ -754,15 +766,29 @@ Argument FN is the function calling this verifier."
       (eieio-barf-if-slot-unbound (aref obj c) obj slot 'oref))))
 
 
-(defun eieio-oref-default (obj slot)
+(defun eieio-oref-default (class slot)
   "Do the work for the macro `oref-default' with similar parameters.
-Fills in OBJ's SLOT with its default value."
-  (declare (gv-setter eieio-oset-default))
-  (cl-check-type obj (or eieio-object class))
+Fills in CLASS's SLOT with its default value."
+  (declare (gv-setter eieio-oset-default)
+           (compiler-macro
+            (lambda (exp)
+              (ignore class)
+              (pcase slot
+                ((and (or `',name (and name (pred keywordp)))
+                      (guard (not (memq name eieio--known-slot-names))))
+                 (macroexp-warn-and-return
+                  (format-message "Unknown slot `%S'" name) exp 'compile-only))
+                ((and (or `',name (and name (pred keywordp)))
+                      (guard (not (memq name eieio--known-class-slot-names))))
+                 (macroexp-warn-and-return
+                  (format-message "Slot `%S' is not class-allocated" name)
+                  exp 'compile-only))
+                (_ exp)))))
+  (cl-check-type class (or eieio-object class))
   (cl-check-type slot symbol)
-  (let* ((cl (cond ((symbolp obj) (cl--find-class obj))
-                   ((eieio-object-p obj) (eieio--object-class obj))
-                   (t obj)))
+  (let* ((cl (cond ((symbolp class) (cl--find-class class))
+                   ((eieio-object-p class) (eieio--object-class class))
+                   (t class)))
         (c (eieio--slot-name-index cl slot)))
     (if (not c)
        ;; It might be missing because it is a :class allocated slot.
@@ -772,27 +798,13 @@ Fills in OBJ's SLOT with its default value."
            ;; Oref that slot.
            (aref (eieio--class-class-allocation-values cl)
                  c)
-         (slot-missing obj slot 'oref-default))
+         (slot-missing class slot 'oref-default))
       (eieio-barf-if-slot-unbound
        (let ((val (cl--slot-descriptor-initform
                    (aref (eieio--class-slots cl)
                          (- c (eval-when-compile eieio--object-num-slots))))))
-        (eieio-default-eval-maybe val))
-       obj (eieio--class-name cl) 'oref-default))))
-
-(defun eieio-default-eval-maybe (val)
-  "Check VAL, and return what `oref-default' would provide."
-  ;; FIXME: What the hell is this supposed to do?  Shouldn't it evaluate
-  ;; variables as well?  Why not just always call `eval'?
-  (cond
-   ;; Is it a function call?  If so, evaluate it.
-   ((eieio-eval-default-p val)
-    (eval val t))
-   ;;;; check for quoted things, and unquote them
-   ;;((and (consp val) (eq (car val) 'quote))
-   ;; (car (cdr val)))
-   ;; return it verbatim
-   (t val)))
+        (eval val t))
+       class (eieio--class-name cl) 'oref-default))))
 
 (defun eieio-oset (obj slot value)
   "Do the work for the macro `oset'.
@@ -819,6 +831,20 @@ Fills in OBJ's SLOT with VALUE."
 (defun eieio-oset-default (class slot value)
   "Do the work for the macro `oset-default'.
 Fills in the default value in CLASS' in SLOT with VALUE."
+  (declare (compiler-macro
+            (lambda (exp)
+              (ignore class value)
+              (pcase slot
+                ((and (or `',name (and name (pred keywordp)))
+                      (guard (not (memq name eieio--known-slot-names))))
+                 (macroexp-warn-and-return
+                  (format-message "Unknown slot `%S'" name) exp 'compile-only))
+                ((and (or `',name (and name (pred keywordp)))
+                      (guard (not (memq name eieio--known-class-slot-names))))
+                 (macroexp-warn-and-return
+                  (format-message "Slot `%S' is not class-allocated" name)
+                  exp 'compile-only))
+                (_ exp)))))
   (setq class (eieio--class-object class))
   (cl-check-type class eieio--class)
   (cl-check-type slot symbol)
@@ -835,22 +861,18 @@ Fills in the default value in CLASS' in SLOT with VALUE."
           (signal 'invalid-slot-name (list (eieio--class-name class) slot)))
       ;; `oset-default' on an instance-allocated slot is allowed by EIEIO but
       ;; not by CLOS and is mildly inconsistent with the :initform thingy, so
-      ;; it'd be nice to get of it.  This said, it is/was used at one place by
-      ;; gnus/registry.el, so it might be used elsewhere as well, so let's
-      ;; keep it for now.
+      ;; it'd be nice to get rid of it.
+      ;; This said, it is/was used at one place by gnus/registry.el, so it
+      ;; might be used elsewhere as well, so let's keep it for now.
       ;; FIXME: Generate a compile-time warning for it!
       ;; (error "Can't `oset-default' an instance-allocated slot: %S of %S"
       ;;        slot class)
       (eieio--validate-slot-value class c value slot)
       ;; Set this into the storage for defaults.
-      (if (eieio-eval-default-p value)
-          (error "Can't set default to a sexp that gets evaluated again"))
       (setf (cl--slot-descriptor-initform
-             ;; FIXME: Apparently we set it both in `slots' and in
-             ;; `object-cache', which seems redundant.
              (aref (eieio--class-slots class)
                    (- c (eval-when-compile eieio--object-num-slots))))
-              value)
+            (macroexp-quote value))
       ;; Take the value, and put it into our cache object.
       (eieio-oset (eieio--class-default-object-cache class)
                   slot value)
@@ -1092,8 +1114,20 @@ These match if the argument is the name of a subclass of 
CLASS."
 
 (defmacro eieio-declare-slots (&rest slots)
   "Declare that SLOTS are known eieio object slot names."
-  `(eval-when-compile
-     (setq eieio--known-slot-names (append ',slots eieio--known-slot-names))))
+  (let ((slotnames (mapcar (lambda (s) (if (consp s) (car s) s)) slots))
+        (classslots (delq nil
+                          (mapcar (lambda (s)
+                                    (when (and (consp s)
+                                               (eq :class (plist-get (cdr s)
+                                                                     
:allocation)))
+                                      (car s)))
+                                  slots))))
+    `(eval-when-compile
+       ,@(when classslots
+           (mapcar (lambda (s) `(add-to-list 'eieio--known-class-slot-names 
',s))
+                   classslots))
+       ,@(mapcar (lambda (s) `(add-to-list 'eieio--known-slot-names ',s))
+                 slotnames))))
 
 (provide 'eieio-core)
 
diff --git a/lisp/emacs-lisp/eieio-custom.el b/lisp/emacs-lisp/eieio-custom.el
index 8257f7a..d7d078b 100644
--- a/lisp/emacs-lisp/eieio-custom.el
+++ b/lisp/emacs-lisp/eieio-custom.el
@@ -46,7 +46,7 @@
             :documentation "A string for testing custom.
 This is the next line of documentation.")
    (listostuff :initarg :listostuff
-              :initform ("1" "2" "3")
+              :initform '("1" "2" "3")
               :type list
               :custom (repeat (string :tag "Stuff"))
               :label "List of Strings"
diff --git a/lisp/emacs-lisp/eieio-speedbar.el 
b/lisp/emacs-lisp/eieio-speedbar.el
index c25ea8a..3f2a653 100644
--- a/lisp/emacs-lisp/eieio-speedbar.el
+++ b/lisp/emacs-lisp/eieio-speedbar.el
@@ -248,7 +248,7 @@ and take the appropriate action."
 Possible values are those symbols supported by the `exp-button-type' argument
 to `speedbar-make-tag-line'."
               :allocation :class)
-   (buttonface :initform speedbar-tag-face
+   (buttonface :initform 'speedbar-tag-face
               :type (or symbol face)
               :documentation
               "The face used on the textual part of the button for this class.
@@ -265,15 +265,15 @@ Add one of the child classes to this class to the parent 
list of a class."
   :abstract t)
 
 (defclass eieio-speedbar-directory-button (eieio-speedbar)
-  ((buttontype :initform angle)
-   (buttonface :initform speedbar-directory-face))
+  ((buttontype :initform 'angle)
+   (buttonface :initform 'speedbar-directory-face))
   "Class providing support for objects which behave like a directory."
   :method-invocation-order :depth-first
   :abstract t)
 
 (defclass eieio-speedbar-file-button (eieio-speedbar)
-  ((buttontype :initform bracket)
-   (buttonface :initform speedbar-file-face))
+  ((buttontype :initform 'bracket)
+   (buttonface :initform 'speedbar-file-face))
   "Class providing support for objects which behave like a file."
   :method-invocation-order :depth-first
   :abstract t)
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 31b6b09..1c8c372 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -131,6 +131,7 @@ and reference them using the function `class-option'."
 
   (let ((testsym1 (intern (concat (symbol-name name) "-p")))
         (testsym2 (intern (format "%s--eieio-childp" name)))
+        (warnings '())
         (accessors ()))
 
     ;; Collect the accessors we need to define.
@@ -145,6 +146,8 @@ and reference them using the function `class-option'."
         ;; Update eieio--known-slot-names already in case we compile code which
         ;; uses this before the class is loaded.
         (cl-pushnew sname eieio--known-slot-names)
+        (when (eq alloc :class)
+          (cl-pushnew sname eieio--known-class-slot-names))
 
        (if eieio-error-unsupported-class-tags
            (let ((tmp soptions))
@@ -176,8 +179,22 @@ and reference them using the function `class-option'."
            (signal 'invalid-slot-type (list :label label)))
 
        ;; Is there an initarg, but allocation of class?
-       (if (and initarg (eq alloc :class))
-           (message "Class allocated slots do not need :initarg"))
+       (when (and initarg (eq alloc :class))
+         (push (format "Meaningless :initarg for class allocated slot '%S'"
+                       sname)
+               warnings))
+
+        (let ((init (plist-get soptions :initform)))
+          (unless (or (macroexp-const-p init)
+                      (eieio--eval-default-p init))
+            ;; FIXME: Historically, EIEIO used a heuristic to try and guess
+            ;; whether the initform is a form to be evaluated or just
+            ;; a constant.  We use `eieio--eval-default-p' to see what the
+            ;; heuristic says and if it disagrees with normal evaluation
+            ;; then tweak the initform to make it fit and emit
+            ;; a warning accordingly.
+            (push (format "Ambiguous initform needs quoting: %S" init)
+                  warnings)))
 
        ;; Anyone can have an accessor function.  This creates a function
        ;; of the specified name, and also performs a `defsetf' if applicable
@@ -223,6 +240,8 @@ This method is obsolete."
        ))
 
     `(progn
+       ,@(mapcar (lambda (w) (macroexp-warn-and-return w `(progn ',w) 
'compile-only))
+                 warnings)
        ;; This test must be created right away so we can have self-
        ;; referencing classes.  ei, a class whose slot can contain only
        ;; pointers to itself.
@@ -282,9 +301,7 @@ This method is obsolete."
 ;;; Get/Set slots in an object.
 ;;
 (defmacro oref (obj slot)
-  "Retrieve the value stored in OBJ in the slot named by SLOT.
-Slot is the name of the slot when created by `defclass' or the label
-created by the :initarg tag."
+  "Retrieve the value stored in OBJ in the slot named by SLOT."
   (declare (debug (form symbolp)))
   `(eieio-oref ,obj (quote ,slot)))
 
@@ -292,13 +309,11 @@ created by the :initarg tag."
 (defalias 'set-slot-value #'eieio-oset)
 (make-obsolete 'set-slot-value "use (setf (slot-value ..) ..) instead" "25.1")
 
-(defmacro oref-default (obj slot)
-  "Get the default value of OBJ (maybe a class) for SLOT.
-The default value is the value installed in a class with the :initform
-tag.  SLOT can be the slot name, or the tag specified by the :initarg
-tag in the `defclass' call."
+(defmacro oref-default (class slot)
+  "Get the value of class allocated slot SLOT.
+CLASS can also be an object, in which case we use the object's class."
   (declare (debug (form symbolp)))
-  `(eieio-oref-default ,obj (quote ,slot)))
+  `(eieio-oref-default ,class (quote ,slot)))
 
 ;;; Handy CLOS macros
 ;;
@@ -538,11 +553,11 @@ OBJECT can be an instance or a class."
              ((eieio-object-p object) (eieio-oref object slot))
              ((symbolp object)        (eieio-oref-default object slot))
              (t (signal 'wrong-type-argument (list 'eieio-object-p object))))
-            eieio-unbound))))
+            eieio--unbound))))
 
 (defun slot-makeunbound (object slot)
   "In OBJECT, make SLOT unbound."
-  (eieio-oset object slot eieio-unbound))
+  (eieio-oset object slot eieio--unbound))
 
 (defun slot-exists-p (object-or-class slot)
   "Return non-nil if OBJECT-OR-CLASS has SLOT."
@@ -740,18 +755,14 @@ dynamically set from SLOTS."
          (slots (eieio--class-slots this-class)))
     (dotimes (i (length slots))
       ;; For each slot, see if we need to evaluate it.
-      ;;
-      ;; Paul Landes said in an email:
-      ;; > CL evaluates it if it can, and otherwise, leaves it as
-      ;; > the quoted thing as you already have.  This is by the
-      ;; > Sonya E. Keene book and other things I've look at on the
-      ;; > web.
       (let* ((slot (aref slots i))
-             (initform (cl--slot-descriptor-initform slot))
-             (dflt (eieio-default-eval-maybe initform)))
-        (when (not (eq dflt initform))
+             (initform (cl--slot-descriptor-initform slot)))
+        ;; Those slots whose initform is constant already have the right
+        ;; value set in the default-object.
+        (unless (macroexp-const-p initform)
           ;; FIXME: We should be able to just do (aset this (+ i <cst>) dflt)!
-          (eieio-oset this (cl--slot-descriptor-name slot) dflt)))))
+          (eieio-oset this (cl--slot-descriptor-name slot)
+                      (eval initform t))))))
   ;; Shared initialize will parse our slots for us.
   (shared-initialize this slots))
 
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index b4f068c..cec89cf 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -538,7 +538,7 @@ documentation to potentially appear in the echo are is 
truncated."
            (and truncatedp
                 (eq eldoc-echo-area-prefer-doc-buffer
                     'maybe)))
-       (get-buffer-window eldoc--doc-buffer)))
+       (get-buffer-window eldoc--doc-buffer 'visible)))
 
 (defun eldoc-display-in-echo-area (docs _interactive)
   "Display DOCS in echo area.
diff --git a/lisp/emacs-lisp/elp.el b/lisp/emacs-lisp/elp.el
index 411ea2a..c2b026d 100644
--- a/lisp/emacs-lisp/elp.el
+++ b/lisp/emacs-lisp/elp.el
@@ -1,7 +1,6 @@
 ;;; elp.el --- Emacs Lisp Profiler  -*- lexical-binding: t -*-
 
-;; Copyright (C) 1994-1995, 1997-1998, 2001-2021 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1994-2021 Free Software Foundation, Inc.
 
 ;; Author: Barry A. Warsaw
 ;; Maintainer: emacs-devel@gnu.org
@@ -30,8 +29,8 @@
 ;; hacks those functions so that profiling information is recorded
 ;; whenever they are called.  To print out the current results, use
 ;; M-x elp-results.  If you want output to go to standard-output
-;; instead of a separate buffer, setq elp-use-standard-output to
-;; non-nil.  With elp-reset-after-results set to non-nil, profiling
+;; instead of a separate buffer, set `elp-use-standard-output' to
+;; non-nil.  With `elp-reset-after-results' set to non-nil, profiling
 ;; information will be reset whenever the results are displayed.  You
 ;; can also reset all profiling info at any time with M-x
 ;; elp-reset-all.
@@ -40,12 +39,12 @@
 ;; the package follows the GNU coding standard of a common textual
 ;; prefix.  Use M-x elp-instrument-package for this.
 ;;
-;; If you want to sort the results, set elp-sort-by-function to some
+;; If you want to sort the results, set `elp-sort-by-function' to some
 ;; predicate function.  The three most obvious choices are predefined:
-;; elp-sort-by-call-count, elp-sort-by-average-time, and
-;; elp-sort-by-total-time.  Also, you can prune from the output, all
+;; `elp-sort-by-call-count', `elp-sort-by-average-time', and
+;; `elp-sort-by-total-time'.  Also, you can prune from the output, all
 ;; functions that have been called fewer than a given number of times
-;; by setting elp-report-limit.
+;; by setting `elp-report-limit'.
 ;;
 ;; Elp can instrument byte-compiled functions just as easily as
 ;; interpreted functions, but it cannot instrument macros.  However,
@@ -95,11 +94,11 @@
 
 ;; Note that there are plenty of factors that could make the times
 ;; reported unreliable, including the accuracy and granularity of your
-;; system clock, and the overhead spent in lisp calculating and
+;; system clock, and the overhead spent in Lisp calculating and
 ;; recording the intervals.  I figure the latter is pretty constant,
 ;; so while the times may not be entirely accurate, I think they'll
 ;; give you a good feel for the relative amount of work spent in the
-;; various lisp routines you are profiling.  Note further that times
+;; various Lisp routines you are profiling.  Note further that times
 ;; are calculated using wall-clock time, so other system load will
 ;; affect accuracy too.
 
@@ -404,15 +403,15 @@ original definition, use \\[elp-restore-function] or 
\\[elp-restore-all]."
 (defvar elp-et-len nil)
 
 (defun elp-sort-by-call-count (vec1 vec2)
-  ;; sort by highest call count.  See `sort'.
+  "Predicate to sort by highest call count.  See `sort'."
   (>= (aref vec1 0) (aref vec2 0)))
 
 (defun elp-sort-by-total-time (vec1 vec2)
-  ;; sort by highest total time spent in function. See `sort'.
+  "Predicate to sort by highest total time spent in function. See `sort'."
   (>= (aref vec1 1) (aref vec2 1)))
 
 (defun elp-sort-by-average-time (vec1 vec2)
-  ;; sort by highest average time spent in function. See `sort'.
+  "Predicate to sort by highest average time spent in function. See `sort'."
   (>= (aref vec1 2) (aref vec2 2)))
 
 (defsubst elp-pack-number (number width)
@@ -470,13 +469,13 @@ original definition, use \\[elp-restore-function] or 
\\[elp-restore-all]."
   "Keymap used on the function name column." )
 
 (defun elp-results-jump-to-definition (&optional event)
-  "Jump to the definition of the function under the point."
+  "Jump to the definition of the function at point."
   (interactive (list last-nonmenu-event))
   (if event (posn-set-point (event-end event)))
   (find-function (get-text-property (point) 'elp-symname)))
 
 (defun elp-output-insert-symname (symname)
-  ;; Insert SYMNAME with text properties.
+  "Insert SYMNAME with text properties."
   (insert (propertize symname
                      'elp-symname (intern symname)
                      'keymap elp-results-symname-map
@@ -484,6 +483,10 @@ original definition, use \\[elp-restore-function] or 
\\[elp-restore-all]."
                      'face 'link
                      'help-echo "mouse-2 or RET jumps to definition")))
 
+(define-derived-mode elp-results-mode special-mode "ELP"
+  "Mode for ELP results."
+  :interactive nil)
+
 ;;;###autoload
 (defun elp-results ()
   "Display current profiling results.
@@ -491,11 +494,12 @@ If `elp-reset-after-results' is non-nil, then current 
profiling
 information for all instrumented functions is reset after results are
 displayed."
   (interactive)
-  (let ((curbuf (current-buffer))
-       (resultsbuf (if elp-recycle-buffers-p
-                       (get-buffer-create elp-results-buffer)
-                     (generate-new-buffer elp-results-buffer))))
-    (set-buffer resultsbuf)
+  (pop-to-buffer
+   (if elp-recycle-buffers-p
+       (get-buffer-create elp-results-buffer)
+     (generate-new-buffer elp-results-buffer)))
+  (elp-results-mode)
+  (let ((inhibit-read-only t))
     (erase-buffer)
     ;; get the length of the longest function name being profiled
     (let* ((longest 0)
@@ -566,9 +570,6 @@ displayed."
       (if elp-sort-by-function
          (setq resvec (sort resvec elp-sort-by-function)))
       (mapc 'elp-output-result resvec))
-    ;; now pop up results buffer
-    (set-buffer curbuf)
-    (pop-to-buffer resultsbuf)
     ;; copy results to standard-output?
     (if (or elp-use-standard-output noninteractive)
         (princ (buffer-substring (point-min) (point-max)))
@@ -587,7 +588,6 @@ displayed."
   "Un-instrument before unloading a function."
   (elp-restore-function (cdr x)))
 
-
 (provide 'elp)
 
 ;;; elp.el ends here
diff --git a/lisp/emacs-lisp/ert-x.el b/lisp/emacs-lisp/ert-x.el
index 1191fb8..59ec4d2 100644
--- a/lisp/emacs-lisp/ert-x.el
+++ b/lisp/emacs-lisp/ert-x.el
@@ -98,7 +98,7 @@ To be used in ERT tests.  If BODY finishes successfully, the 
test
 buffer is killed; if there is an error, the test buffer is kept
 around on error for further inspection.  Its name is derived from
 the name of the test and the result of NAME-FORM."
-  (declare (debug ((":name" form) body))
+  (declare (debug ((":name" form) def-body))
            (indent 1))
   `(ert--call-with-test-buffer ,name-form (lambda () ,@body)))
 
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index e91ec0a..92acfe7 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -313,12 +313,13 @@ It should only be stopped when ran from inside 
ert--run-test-internal."
                                  (list :form `(,,fn ,@,args))
                                  (unless (eql ,value ',default-value)
                                    (list :value ,value))
-                                 (let ((-explainer-
-                                        (and (symbolp ',fn-name)
-                                             (get ',fn-name 'ert-explainer))))
-                                   (when -explainer-
-                                     (list :explanation
-                                           (apply -explainer- ,args)))))
+                                 (unless (eql ,value ',default-value)
+                                   (let ((-explainer-
+                                          (and (symbolp ',fn-name)
+                                               (get ',fn-name 
'ert-explainer))))
+                                     (when -explainer-
+                                       (list :explanation
+                                             (apply -explainer- ,args))))))
                          value)
                ,value))))))))
 
@@ -1279,11 +1280,28 @@ EXPECTEDP specifies whether the result was expected."
              (ert-test-quit '("quit" "QUIT")))))
     (elt s (if expectedp 0 1))))
 
+(defun ert-reason-for-test-result (result)
+  "Return the reason given for RESULT, as a string.
+
+The reason is the argument given when invoking `ert-fail' or `ert-skip'.
+It is output using `prin1' prefixed by two spaces.
+
+If no reason was given, or for a successful RESULT, return the
+empty string."
+  (let ((reason
+         (and
+          (ert-test-result-with-condition-p result)
+          (cadr (ert-test-result-with-condition-condition result))))
+        (print-escape-newlines t)
+        (print-level 6)
+        (print-length 10))
+    (if reason (format "  %S" reason) "")))
+
 (defun ert--pp-with-indentation-and-newline (object)
   "Pretty-print OBJECT, indenting it to the current column of point.
 Ensures a final newline is inserted."
   (let ((begin (point))
-        (pp-escape-newlines nil)
+        (pp-escape-newlines t)
         (print-escape-control-characters t))
     (pp object (current-buffer))
     (unless (bolp) (insert "\n"))
@@ -1369,18 +1387,24 @@ Returns the stats object."
               (cl-loop for test across (ert--stats-tests stats)
                        for result = (ert-test-most-recent-result test) do
                        (when (not (ert-test-result-expected-p test result))
-                         (message "%9s  %S"
+                         (message "%9s  %S%s"
                                   (ert-string-for-test-result result nil)
-                                  (ert-test-name test))))
+                                  (ert-test-name test)
+                                  (if (getenv "EMACS_TEST_VERBOSE")
+                                      (ert-reason-for-test-result result)
+                                    ""))))
               (message "%s" ""))
             (unless (zerop skipped)
               (message "%s skipped results:" skipped)
               (cl-loop for test across (ert--stats-tests stats)
                        for result = (ert-test-most-recent-result test) do
                        (when (ert-test-result-type-p result :skipped)
-                         (message "%9s  %S"
+                         (message "%9s  %S%s"
                                   (ert-string-for-test-result result nil)
-                                  (ert-test-name test))))
+                                  (ert-test-name test)
+                                  (if (getenv "EMACS_TEST_VERBOSE")
+                                      (ert-reason-for-test-result result)
+                                    ""))))
               (message "%s" "")))))
        (test-started
         )
@@ -1528,7 +1552,7 @@ Ran \\([0-9]+\\) tests, \\([0-9]+\\) results as expected\
     (when badtests
       (message "%d files did not finish:" (length badtests))
       (mapc (lambda (l) (message "  %s" l)) badtests)
-      (if (getenv "EMACS_HYDRA_CI")
+      (if (or (getenv "EMACS_HYDRA_CI") (getenv "EMACS_EMBA_CI"))
           (with-temp-buffer
             (dolist (f badtests)
               (erase-buffer)
@@ -1544,8 +1568,8 @@ Ran \\([0-9]+\\) tests, \\([0-9]+\\) results as expected\
       (setq tests (sort tests (lambda (x y) (> (car x) (car y)))))
       (when (< high (length tests)) (setcdr (nthcdr (1- high) tests) nil))
       (message "%s" (mapconcat #'cdr tests "\n")))
-    ;; More details on hydra, where the logs are harder to get to.
-    (when (and (getenv "EMACS_HYDRA_CI")
+    ;; More details on hydra and emba, where the logs are harder to get to.
+    (when (and (or (getenv "EMACS_HYDRA_CI") (getenv "EMACS_EMBA_CI"))
                (not (zerop (+ nunexpected nskipped))))
       (message "\nDETAILS")
       (message "-------")
diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el
index 58876a4..7bc3e6b 100644
--- a/lisp/emacs-lisp/find-func.el
+++ b/lisp/emacs-lisp/find-func.el
@@ -123,10 +123,18 @@ should insert the feature name."
   :group 'xref
   :version "25.1")
 
+(defun find-function--defface (symbol)
+  (catch 'found
+    (while (re-search-forward (format find-face-regexp symbol) nil t)
+      (unless (ppss-comment-or-string-start
+               (save-excursion (syntax-ppss (match-beginning 0))))
+        ;; We're not in a comment or a string.
+        (throw 'found t)))))
+
 (defvar find-function-regexp-alist
   '((nil . find-function-regexp)
     (defvar . find-variable-regexp)
-    (defface . find-face-regexp)
+    (defface . find-function--defface)
     (feature . find-feature-regexp)
     (defalias . find-alias-regexp))
   "Alist mapping definition types into regexp variables.
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index ce48e57..f08f7ac 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -135,7 +135,7 @@ The returned value will then be an Elisp expression that 
first evaluates
 all the parts of PLACE that can be evaluated and then runs E.
 
 \(fn (GETTER SETTER) PLACE &rest BODY)"
-  (declare (indent 2) (debug (sexp form body)))
+  (declare (indent 2) (debug (sexp form def-body)))
   `(gv-get ,place (lambda ,vars ,@body)))
 
 ;; Different ways to declare a generalized variable.
diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el
index 73a33a5..83da495 100644
--- a/lisp/emacs-lisp/lisp-mnt.el
+++ b/lisp/emacs-lisp/lisp-mnt.el
@@ -360,10 +360,10 @@ Return argument is of the form (\"HOLDER\" \"YEAR1\" ... 
\"YEARN\")"
   "Split up an email address X into full name and real email address.
 The value is a cons of the form (FULLNAME . ADDRESS)."
   (cond ((string-match "\\(.+\\) [(<]\\(\\S-+@\\S-+\\)[>)]" x)
-        (cons (match-string 1 x)
+        (cons (string-trim-right (match-string 1 x))
               (match-string 2 x)))
        ((string-match "\\(\\S-+@\\S-+\\) [(<]\\(.*\\)[>)]" x)
-        (cons (match-string 2 x)
+        (cons (string-trim-right (match-string 2 x))
               (match-string 1 x)))
        ((string-match "\\S-+@\\S-+" x)
         (cons nil x))
@@ -378,14 +378,22 @@ the cdr is an email address."
     (let ((authorlist (lm-header-multiline "author")))
       (mapcar #'lm-crack-address authorlist))))
 
+(defun lm-maintainers (&optional file)
+  "Return the maintainer list of file FILE, or current buffer if FILE is nil.
+If the maintainers are unspecified, then return the authors.
+Each element of the list is a cons; the car is the full name,
+the cdr is an email address."
+  (lm-with-file file
+    (mapcar #'lm-crack-address
+            (or (lm-header-multiline "maintainer")
+                (lm-header-multiline "author")))))
+
 (defun lm-maintainer (&optional file)
   "Return the maintainer of file FILE, or current buffer if FILE is nil.
+If the maintainer is unspecified, then return the author.
 The return value has the form (NAME . ADDRESS)."
-  (lm-with-file file
-    (let ((maint (lm-header "maintainer")))
-      (if maint
-         (lm-crack-address maint)
-       (car (lm-authors))))))
+  (declare (obsolete lm-maintainers "28.1"))
+  (car (lm-maintainers file)))
 
 (defun lm-creation-date (&optional file)
   "Return the created date given in file FILE, or current buffer if FILE is 
nil."
@@ -545,7 +553,7 @@ copyright notice is allowed."
                "Can't find package name")
               ((not (lm-authors))
                "`Author:' tag missing")
-              ((not (lm-maintainer))
+              ((not (lm-maintainers))
                "`Maintainer:' tag missing")
               ((not (lm-summary))
                "Can't find the one-line summary description")
@@ -613,7 +621,7 @@ Prompts for bug subject TOPIC.  Leaves you in a mail 
buffer."
   (interactive "sBug Subject: ")
   (require 'emacsbug)
   (let ((package (lm-get-package-name))
-       (addr (lm-maintainer))
+       (addr (car (lm-maintainers)))
        (version (lm-version)))
     (compose-mail (if addr
                      (concat (car addr) " <" (cdr addr) ">")
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 67b7546..51fb885 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -682,10 +682,16 @@ font-lock keywords will not be case sensitive."
 
 (defun lisp-outline-level ()
   "Lisp mode `outline-level' function."
+  ;; Expects outline-regexp is ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("
+  ;; and point is at the beginning of a matching line.
   (let ((len (- (match-end 0) (match-beginning 0))))
-    (if (looking-at "(\\|;;;###autoload")
-       1000
-      len)))
+    (cond ((looking-at "(\\|;;;###autoload")
+           1000)
+          ((looking-at ";;\\(;+\\) ")
+           (- (match-end 1) (match-beginning 1)))
+          ;; Above should match everything but just in case.
+          (t
+           len))))
 
 (defun lisp-current-defun-name ()
   "Return the name of the defun at point, or nil."
@@ -759,7 +765,7 @@ All commands in `lisp-mode-shared-map' are inherited by 
this map.")
      :help "Run an inferior Lisp process, input and output via buffer 
`*inferior-lisp*'"]))
 
 (define-derived-mode lisp-mode lisp-data-mode "Lisp"
-  "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
+  "Major mode for editing programs in Common Lisp and other similar Lisps.
 Commands:
 Delete converts tabs to spaces as it moves back.
 Blank lines separate paragraphs.  Semicolons start comments.
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 46ca948..2495277 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -503,7 +503,7 @@ If ARG is positive, that's the end of the buffer.
 Otherwise, that's the beginning of the buffer."
   (if (> arg 0) (point-max) (point-min)))
 
-(defun end-of-defun (&optional arg)
+(defun end-of-defun (&optional arg interactive)
   "Move forward to next end of defun.
 With argument, do it that many times.
 Negative argument -N means move back to Nth preceding end of defun.
@@ -513,129 +513,145 @@ matches the open-parenthesis that starts a defun; see 
function
 `beginning-of-defun'.
 
 If variable `end-of-defun-function' is non-nil, its value
-is called as a function to find the defun's end."
-  (interactive "^p")
-  (or (not (eq this-command 'end-of-defun))
-      (eq last-command 'end-of-defun)
-      (and transient-mark-mode mark-active)
-      (push-mark))
-  (if (or (null arg) (= arg 0)) (setq arg 1))
-  (let ((pos (point))
-        (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))
-       (skip (lambda ()
-               ;; When comparing point against pos, we want to consider that if
-               ;; point was right after the end of the function, it's still
-               ;; considered as "in that function".
-               ;; E.g. `eval-defun' from right after the last close-paren.
-               (unless (bolp)
-                 (skip-chars-forward " \t")
-                 (if (looking-at "\\s<\\|\n")
-                     (forward-line 1))))))
-    (funcall end-of-defun-function)
-    (when (<= arg 1)
-      (funcall skip))
-    (cond
-     ((> arg 0)
-      ;; Moving forward.
-      (if (> (point) pos)
-          ;; We already moved forward by one because we started from
-          ;; within a function.
-          (setq arg (1- arg))
-        ;; We started from after the end of the previous function.
-        (goto-char pos))
-      (unless (zerop arg)
-        (beginning-of-defun-raw (- arg))
-        (funcall end-of-defun-function)))
-     ((< arg 0)
-      ;; Moving backward.
-      (if (< (point) pos)
-          ;; We already moved backward because we started from between
-          ;; two functions.
-          (setq arg (1+ arg))
-        ;; We started from inside a function.
-        (goto-char beg))
-      (unless (zerop arg)
+is called as a function to find the defun's end.
+
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "^p\nd")
+  (if interactive
+      (condition-case e
+          (end-of-defun arg nil)
+        (scan-error (user-error (cadr e))))
+    (or (not (eq this-command 'end-of-defun))
+        (eq last-command 'end-of-defun)
+        (and transient-mark-mode mark-active)
+        (push-mark))
+    (if (or (null arg) (= arg 0)) (setq arg 1))
+    (let ((pos (point))
+          (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))
+         (skip (lambda ()
+                 ;; When comparing point against pos, we want to consider that
+                 ;; if point was right after the end of the function, it's
+                 ;; still considered as "in that function".
+                 ;; E.g. `eval-defun' from right after the last close-paren.
+                 (unless (bolp)
+                   (skip-chars-forward " \t")
+                   (if (looking-at "\\s<\\|\n")
+                       (forward-line 1))))))
+      (funcall end-of-defun-function)
+      (when (<= arg 1)
+        (funcall skip))
+      (cond
+       ((> arg 0)
+        ;; Moving forward.
+        (if (> (point) pos)
+            ;; We already moved forward by one because we started from
+            ;; within a function.
+            (setq arg (1- arg))
+          ;; We started from after the end of the previous function.
+          (goto-char pos))
+        (unless (zerop arg)
+          (beginning-of-defun-raw (- arg))
+          (funcall end-of-defun-function)))
+       ((< arg 0)
+        ;; Moving backward.
+        (if (< (point) pos)
+            ;; We already moved backward because we started from between
+            ;; two functions.
+            (setq arg (1+ arg))
+          ;; We started from inside a function.
+          (goto-char beg))
+        (unless (zerop arg)
+          (beginning-of-defun-raw (- arg))
+         (setq beg (point))
+          (funcall end-of-defun-function))))
+      (funcall skip)
+      (while (and (< arg 0) (>= (point) pos))
+        ;; We intended to move backward, but this ended up not doing so:
+        ;; Try harder!
+        (goto-char beg)
         (beginning-of-defun-raw (- arg))
-       (setq beg (point))
-        (funcall end-of-defun-function))))
-    (funcall skip)
-    (while (and (< arg 0) (>= (point) pos))
-      ;; We intended to move backward, but this ended up not doing so:
-      ;; Try harder!
-      (goto-char beg)
-      (beginning-of-defun-raw (- arg))
-      (if (>= (point) beg)
-         (setq arg 0)
-       (setq beg (point))
-        (funcall end-of-defun-function)
-       (funcall skip)))))
-
-(defun mark-defun (&optional arg)
+        (if (>= (point) beg)
+           (setq arg 0)
+         (setq beg (point))
+          (funcall end-of-defun-function)
+         (funcall skip))))))
+
+(defun mark-defun (&optional arg interactive)
   "Put mark at end of this defun, point at beginning.
 The defun marked is the one that contains point or follows point.
 With positive ARG, mark this and that many next defuns; with negative
 ARG, change the direction of marking.
 
 If the mark is active, it marks the next or previous defun(s) after
-the one(s) already marked."
-  (interactive "p")
-  (setq arg (or arg 1))
-  ;; There is no `mark-defun-back' function - see
-  ;; https://lists.gnu.org/r/bug-gnu-emacs/2016-11/msg00079.html
-  ;; for explanation
-  (when (eq last-command 'mark-defun-back)
-    (setq arg (- arg)))
-  (when (< arg 0)
-    (setq this-command 'mark-defun-back))
-  (cond ((use-region-p)
-         (if (>= arg 0)
-             (set-mark
-              (save-excursion
-                (goto-char (mark))
-                ;; change the dotimes below to (end-of-defun arg) once bug 
#24427 is fixed
-                (dotimes (_ignore arg)
-                  (end-of-defun))
-                (point)))
-           (beginning-of-defun-comments (- arg))))
-        (t
-         (let ((opoint (point))
-               beg end)
-           (push-mark opoint)
-           ;; Try first in this order for the sake of languages with nested
-           ;; functions where several can end at the same place as with the
-           ;; offside rule, e.g. Python.
-           (beginning-of-defun-comments)
-           (setq beg (point))
-           (end-of-defun)
-           (setq end (point))
-           (when (or (and (<= (point) opoint)
-                          (> arg 0))
-                     (= beg (point-min))) ; we were before the first defun!
-             ;; beginning-of-defun moved back one defun so we got the wrong
-             ;; one.  If ARG < 0, however, we actually want to go back.
-             (goto-char opoint)
-             (end-of-defun)
-             (setq end (point))
-             (beginning-of-defun-comments)
-             (setq beg (point)))
-           (goto-char beg)
-           (cond ((> arg 0)
-                  ;; change the dotimes below to (end-of-defun arg) once bug 
#24427 is fixed
+the one(s) already marked.
+
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "p\nd")
+  (if interactive
+      (condition-case e
+          (mark-defun arg nil)
+        (scan-error (user-error (cadr e))))
+    (setq arg (or arg 1))
+    ;; There is no `mark-defun-back' function - see
+    ;; https://lists.gnu.org/r/bug-gnu-emacs/2016-11/msg00079.html
+    ;; for explanation
+    (when (eq last-command 'mark-defun-back)
+      (setq arg (- arg)))
+    (when (< arg 0)
+      (setq this-command 'mark-defun-back))
+    (cond ((use-region-p)
+           (if (>= arg 0)
+               (set-mark
+                (save-excursion
+                  (goto-char (mark))
+                  ;; change the dotimes below to (end-of-defun arg)
+                  ;; once bug #24427 is fixed
                   (dotimes (_ignore arg)
                     (end-of-defun))
-                  (setq end (point))
-                  (push-mark end nil t)
-                  (goto-char beg))
-                 (t
-                  (goto-char beg)
-                  (unless (= arg -1)    ; beginning-of-defun behaves
-                                        ; strange with zero arg - see
-                                        ; 
https://lists.gnu.org/r/bug-gnu-emacs/2017-02/msg00196.html
-                    (beginning-of-defun (1- (- arg))))
-                  (push-mark end nil t))))))
-  (skip-chars-backward "[:space:]\n")
-  (unless (bobp)
-    (forward-line 1)))
+                  (point)))
+             (beginning-of-defun-comments (- arg))))
+          (t
+           (let ((opoint (point))
+                 beg end)
+             (push-mark opoint)
+             ;; Try first in this order for the sake of languages with nested
+             ;; functions where several can end at the same place as with the
+             ;; offside rule, e.g. Python.
+             (beginning-of-defun-comments)
+             (setq beg (point))
+             (end-of-defun)
+             (setq end (point))
+             (when (or (and (<= (point) opoint)
+                            (> arg 0))
+                       (= beg (point-min))) ; we were before the first defun!
+               ;; beginning-of-defun moved back one defun so we got the wrong
+               ;; one.  If ARG < 0, however, we actually want to go back.
+               (goto-char opoint)
+               (end-of-defun)
+               (setq end (point))
+               (beginning-of-defun-comments)
+               (setq beg (point)))
+             (goto-char beg)
+             (cond ((> arg 0)
+                    ;; change the dotimes below to (end-of-defun arg)
+                    ;; once bug #24427 is fixed
+                    (dotimes (_ignore arg)
+                      (end-of-defun))
+                    (setq end (point))
+                    (push-mark end nil t)
+                    (goto-char beg))
+                   (t
+                    (goto-char beg)
+                    (unless (= arg -1)
+                      ;; beginning-of-defun behaves strange with zero arg - see
+                      ;; lists.gnu.org/r/bug-gnu-emacs/2017-02/msg00196.html
+                      (beginning-of-defun (1- (- arg))))
+                    (push-mark end nil t))))))
+    (skip-chars-backward "[:space:]\n")
+    (unless (bobp)
+      (forward-line 1))))
 
 (defvar narrow-to-defun-include-comments nil
   "If non-nil, `narrow-to-defun' will also show comments preceding the defun.")
diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el
index c0cbc7b..5c76fb9 100644
--- a/lisp/emacs-lisp/map.el
+++ b/lisp/emacs-lisp/map.el
@@ -124,7 +124,9 @@ or array."
                           (with-no-warnings (map-put! ,mgetter ,key ,v 
,testfn))
                         (map-not-inplace
                          ,(funcall msetter
-                                   `(map-insert ,mgetter ,key ,v))))))))))
+                                   `(map-insert ,mgetter ,key ,v))
+                         ;; Always return the value.
+                         ,v))))))))
    ;; `testfn' is deprecated.
    (advertised-calling-convention (map key &optional default) "27.1"))
   ;; Can't use `cl-defmethod' with `advertised-calling-convention'.
@@ -429,18 +431,22 @@ To insert an element without modifying MAP, use 
`map-insert'."
   ;; `testfn' only exists for backward compatibility with `map-put'!
   (declare (advertised-calling-convention (map key value) "27.1"))
   ;; Can't use `cl-defmethod' with `advertised-calling-convention'.
-  (map--dispatch map
-    :list
-    (if (map--plist-p map)
-        (plist-put map key value)
-      (let ((oldmap map))
-        (setf (alist-get key map key nil (or testfn #'equal)) value)
-        (unless (eq oldmap map)
-          (signal 'map-not-inplace (list oldmap)))))
-    :hash-table (puthash key value map)
-    ;; FIXME: If `key' is too large, should we signal `map-not-inplace'
-    ;; and let `map-insert' grow the array?
-    :array (aset map key value)))
+  (map--dispatch
+   map
+   :list
+   (progn
+     (if (map--plist-p map)
+         (plist-put map key value)
+       (let ((oldmap map))
+         (setf (alist-get key map key nil (or testfn #'equal)) value)
+         (unless (eq oldmap map)
+           (signal 'map-not-inplace (list oldmap)))))
+     ;; Always return the value.
+     value)
+   :hash-table (puthash key value map)
+   ;; FIXME: If `key' is too large, should we signal `map-not-inplace'
+   ;; and let `map-insert' grow the array?
+   :array (aset map key value)))
 
 (cl-defgeneric map-insert (map key value)
   "Return a new map like MAP except that it associates KEY with VALUE.
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index f974056..4804e85 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -320,17 +320,17 @@ is also interactive.  There are 3 cases:
 
 ;;;###autoload
 (defun advice--add-function (where ref function props)
-  (when (and (featurep 'nativecomp)
+  (when (and (featurep 'native-compile)
              (subr-primitive-p (gv-deref ref)))
     (let ((subr-name (intern (subr-name (gv-deref ref)))))
       ;; Requiring the native compiler to advice `macroexpand' cause a
-      ;; circular dependency in eager macro expansion.
-      ;; uniquify is advising `rename-buffer' while being loaded in
-      ;; loadup.el.  This would require the whole native compiler
-      ;; machinery but we don't want to include it in the dump.
-      ;; Because these two functions are already handled in
-      ;; `comp-never-optimize-functions' we hack the problem this way
-      ;; for now :/
+      ;; circular dependency in eager macro expansion.  uniquify is
+      ;; advising `rename-buffer' while being loaded in loadup.el.
+      ;; This would require the whole native compiler machinery but we
+      ;; don't want to include it in the dump.  Because these two
+      ;; functions are already handled in
+      ;; `native-comp-never-optimize-functions' we hack the problem
+      ;; this way for now :/
       (unless (memq subr-name '(macroexpand rename-buffer))
         ;; Must require explicitly as during bootstrap we have no
         ;; autoloads.
@@ -503,7 +503,7 @@ arguments.  Note if NAME is nil the advice is anonymous;
 otherwise it is named `SYMBOL@NAME'.
 
 \(fn SYMBOL (WHERE LAMBDA-LIST &optional NAME DEPTH) &rest BODY)"
-  (declare (indent 2) (doc-string 3) (debug (sexp sexp body)))
+  (declare (indent 2) (doc-string 3) (debug (sexp sexp def-body)))
   (or (listp args) (signal 'wrong-type-argument (list 'listp args)))
   (or (<= 2 (length args) 4)
       (signal 'wrong-number-of-arguments (list 2 4 (length args))))
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 5035850..a0f1ab0 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1081,7 +1081,7 @@ This assumes that `pkg-desc' has already been activated 
with
   "Native compile installed package PKG-DESC asynchronously.
 This assumes that `pkg-desc' has already been activated with
 `package-activate-1'."
-  (when (and (featurep 'nativecomp)
+  (when (and (featurep 'native-compile)
              (native-comp-available-p))
     (let ((warning-minimum-level :error))
       (native-compile-async (package-desc-dir pkg-desc) t))))
@@ -1305,7 +1305,10 @@ is non-nil, don't propagate connection errors (does not 
apply to
 errors signaled by ERROR-FORM or by BODY).
 
 \(fn URL &key ASYNC FILE ERROR-FORM NOERROR &rest BODY)"
-  (declare (indent defun) (debug t))
+  (declare (indent defun)
+           ;; FIXME: This should be something like
+           ;; `form def-body &rest form', but that doesn't work.
+           (debug (form &rest sexp)))
   (while (keywordp (car body))
     (setq body (cdr (cdr body))))
   `(package--with-response-buffer-1 ,url (lambda () ,@body)
@@ -2265,9 +2268,9 @@ confirmation to install packages."
   "Delete DIR recursively.
 Clean-up the corresponding .eln files if Emacs is native
 compiled."
-  (when (featurep 'nativecomp)
+  (when (featurep 'native-compile)
     (cl-loop
-     for file in (directory-files-recursively dir ".el\\'")
+     for file in (directory-files-recursively dir "\\.el\\'")
      do (comp-clean-up-stale-eln (comp-el-to-eln-filename file))))
   (delete-directory dir t))
 
@@ -3371,7 +3374,8 @@ If optional arg BUTTON is non-nil, describe its 
associated package."
         (forward-line 1)))))
 
 (defvar package--quick-help-keys
-  '(("install," "delete," "unmark," ("execute" . 1))
+  '((("mark for installation," . 9)
+     ("mark for deletion," . 9) "unmark," ("execute marked actions" . 1))
     ("next," "previous")
     ("Hide-package," "(-toggle-hidden")
     ("g-refresh-contents," "/-filter," "help")))
diff --git a/lisp/emacs-lisp/pp.el b/lisp/emacs-lisp/pp.el
index 2fd4724..0bf774d 100644
--- a/lisp/emacs-lisp/pp.el
+++ b/lisp/emacs-lisp/pp.el
@@ -139,7 +139,7 @@ Also add the value to the front of the list in the variable 
`values'."
   (pp-display-expression (macroexpand-1 expression) "*Pp Macroexpand Output*"))
 
 (defun pp-last-sexp ()
-  "Read sexp before point.  Ignores leading comment characters."
+  "Read sexp before point.  Ignore leading comment characters."
   (with-syntax-table emacs-lisp-mode-syntax-table
     (let ((pt (point)))
       (save-excursion
@@ -159,7 +159,7 @@ Also add the value to the front of the list in the variable 
`values'."
 ;;;###autoload
 (defun pp-eval-last-sexp (arg)
   "Run `pp-eval-expression' on sexp before point.
-With argument, pretty-print output into current buffer.
+With ARG, pretty-print output into current buffer.
 Ignores leading comment characters."
   (interactive "P")
   (if arg
@@ -172,7 +172,7 @@ Ignores leading comment characters."
 ;;;###autoload
 (defun pp-macroexpand-last-sexp (arg)
   "Run `pp-macroexpand-expression' on sexp before point.
-With argument, pretty-print output into current buffer.
+With ARG, pretty-print output into current buffer.
 Ignores leading comment characters."
   (interactive "P")
   (if arg
diff --git a/lisp/emacs-lisp/re-builder.el b/lisp/emacs-lisp/re-builder.el
index 455fcac..7d042a9 100644
--- a/lisp/emacs-lisp/re-builder.el
+++ b/lisp/emacs-lisp/re-builder.el
@@ -341,7 +341,12 @@ the regexp builder.  It displays a buffer named 
\"*RE-Builder*\"
 in another window, initially containing an empty regexp.
 
 As you edit the regexp in the \"*RE-Builder*\" buffer, the
-matching parts of the target buffer will be highlighted."
+matching parts of the target buffer will be highlighted.
+
+Case-sensitivity can be toggled with \\[reb-toggle-case].  The
+regexp builder supports three different forms of input which can
+be set with \\[reb-change-syntax].  More options and details are
+provided in the Commentary section of this library."
   (interactive)
   (if (and (string= (buffer-name) reb-buffer)
           (reb-mode-buffer-p))
diff --git a/lisp/emacs-lisp/rmc.el b/lisp/emacs-lisp/rmc.el
index bedf598..8abe570 100644
--- a/lisp/emacs-lisp/rmc.el
+++ b/lisp/emacs-lisp/rmc.el
@@ -26,29 +26,38 @@
 (require 'seq)
 
 ;;;###autoload
-(defun read-multiple-choice (prompt choices)
-  "Ask user a multiple choice question.
-PROMPT should be a string that will be displayed as the prompt.
-
-CHOICES is a list of (KEY NAME [DESCRIPTION]).  KEY is a
-character to be entered.  NAME is a short name for the entry to
-be displayed while prompting (if there's room, it might be
-shortened).  DESCRIPTION is an optional longer explanation that
-will be displayed in a help buffer if the user requests more
-help.
+(defun read-multiple-choice (prompt choices &optional help-string)
+  "Ask user to select an entry from CHOICES, promting with PROMPT.
+This function allows to ask the user a multiple-choice question.
+
+CHOICES should be a list of the form (KEY NAME [DESCRIPTION]).
+KEY is a character the user should type to select the entry.
+NAME is a short name for the entry to be displayed while prompting
+\(if there's no room, it might be shortened).
+DESCRIPTION is an optional longer description of the entry; it will
+be displayed in a help buffer if the user requests more help.  This
+help description has a fixed format in columns.  For greater
+flexibility, instead of passing a DESCRIPTION, the caller can pass
+the optional argument HELP-STRING.  This argument is a string that
+should contain a more detailed description of all of the possible
+choices.  `read-multiple-choice' will display that description in a
+help buffer if the user requests that.
 
 This function translates user input into responses by consulting
 the bindings in `query-replace-map'; see the documentation of
-that variable for more information.  In this case, the useful
-bindings are `recenter', `scroll-up', and `scroll-down'.  If the
-user enters `recenter', `scroll-up', or `scroll-down' responses,
-perform the requested window recentering or scrolling and ask
-again.
-
-When `use-dialog-box' is t (the default), this function can pop
-up a dialog window to collect the user input.  That functionality
-requires `display-popup-menus-p' to return t.  Otherwise, a
-text dialog will be used.
+that variable for more information.  The relevant bindings for the
+purposes of this function are `recenter', `scroll-up', `scroll-down',
+and `edit'.
+If the user types the `recenter', `scroll-up', or `scroll-down'
+responses, the function performs the requested window recentering or
+scrolling, and then asks the question again.  If the user enters `edit',
+the function starts a recursive edit.  When the user exit the recursive
+edit, the multiple-choice prompt gains focus again.
+
+When `use-dialog-box' is t (the default), and the command using this
+function was invoked via the mouse, this function pops up a GUI dialog
+to collect the user input, but only if Emacs is capable of using GUI
+dialogs.  Otherwise, the function will always use text-mode dialogs.
 
 The return value is the matching entry from the CHOICES list.
 
@@ -133,6 +142,13 @@ Usage example:
                   (ignore-errors (scroll-other-window)) t)
                  ((eq answer 'scroll-other-window-down)
                   (ignore-errors (scroll-other-window-down)) t)
+                 ((eq answer 'edit)
+                  (save-match-data
+                    (save-excursion
+                      (message "%s"
+                               (substitute-command-keys
+                                "Recursive edit; type \\[exit-recursive-edit] 
to return to help screen"))
+                      (recursive-edit))))
                  (t tchar)))
           (when (eq tchar t)
             (setq wrong-char nil
@@ -141,57 +157,61 @@ Usage example:
           ;; help messages.
           (when (and (not (eq tchar nil))
                      (not (assq tchar choices)))
-           (setq wrong-char (not (memq tchar '(?? ?\C-h)))
+           (setq wrong-char (not (memq tchar `(?? ,help-char)))
                   tchar nil)
             (when wrong-char
               (ding))
-            (with-help-window (setq buf (get-buffer-create
-                                         "*Multiple Choice Help*"))
-              (with-current-buffer buf
-                (erase-buffer)
-                (pop-to-buffer buf)
-                (insert prompt "\n\n")
-                (let* ((columns (/ (window-width) 25))
-                       (fill-column 21)
-                       (times 0)
-                       (start (point)))
-                  (dolist (elem choices)
-                    (goto-char start)
-                    (unless (zerop times)
-                      (if (zerop (mod times columns))
-                          ;; Go to the next "line".
-                          (goto-char (setq start (point-max)))
-                        ;; Add padding.
-                        (while (not (eobp))
-                          (end-of-line)
-                          (insert (make-string (max (- (* (mod times columns)
-                                                          (+ fill-column 4))
-                                                       (current-column))
-                                                    0)
-                                               ?\s))
-                          (forward-line 1))))
-                    (setq times (1+ times))
-                    (let ((text
-                           (with-temp-buffer
-                             (insert (format
-                                      "%c: %s\n"
-                                      (car elem)
-                                      (cdr (assq (car elem) altered-names))))
-                             (fill-region (point-min) (point-max))
-                             (when (nth 2 elem)
-                               (let ((start (point)))
-                                 (insert (nth 2 elem))
-                                 (unless (bolp)
-                                   (insert "\n"))
-                                 (fill-region start (point-max))))
-                             (buffer-string))))
+            (setq buf (get-buffer-create "*Multiple Choice Help*"))
+            (if (stringp help-string)
+                (with-help-window buf
+                  (with-current-buffer buf
+                    (insert help-string)))
+              (with-help-window buf
+                (with-current-buffer buf
+                  (erase-buffer)
+                  (pop-to-buffer buf)
+                  (insert prompt "\n\n")
+                  (let* ((columns (/ (window-width) 25))
+                         (fill-column 21)
+                         (times 0)
+                         (start (point)))
+                    (dolist (elem choices)
                       (goto-char start)
-                      (dolist (line (split-string text "\n"))
-                        (end-of-line)
-                        (if (bolp)
-                            (insert line "\n")
-                          (insert line))
-                        (forward-line 1)))))))))))
+                      (unless (zerop times)
+                        (if (zerop (mod times columns))
+                            ;; Go to the next "line".
+                            (goto-char (setq start (point-max)))
+                          ;; Add padding.
+                          (while (not (eobp))
+                            (end-of-line)
+                            (insert (make-string (max (- (* (mod times columns)
+                                                            (+ fill-column 4))
+                                                         (current-column))
+                                                      0)
+                                                 ?\s))
+                            (forward-line 1))))
+                      (setq times (1+ times))
+                      (let ((text
+                             (with-temp-buffer
+                               (insert (format
+                                        "%c: %s\n"
+                                        (car elem)
+                                        (cdr (assq (car elem) altered-names))))
+                               (fill-region (point-min) (point-max))
+                               (when (nth 2 elem)
+                                 (let ((start (point)))
+                                   (insert (nth 2 elem))
+                                   (unless (bolp)
+                                     (insert "\n"))
+                                   (fill-region start (point-max))))
+                               (buffer-string))))
+                        (goto-char start)
+                        (dolist (line (split-string text "\n"))
+                          (end-of-line)
+                          (if (bolp)
+                              (insert line "\n")
+                            (insert line))
+                          (forward-line 1))))))))))))
     (when (buffer-live-p buf)
       (kill-buffer buf))
     (assq tchar choices)))
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 1e3eb9c..071d390 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -1442,15 +1442,25 @@ following constructs:
                    introduced by a previous (let REF ...)
                    construct."
   (let* ((rx--pcase-vars nil)
-         (regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps))))
-         (nvars (length rx--pcase-vars)))
+         (regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps)))))
     `(and (pred stringp)
-          ,(if (zerop nvars)
-               ;; No variables bound: a single predicate suffices.
-               `(pred (string-match ,regexp))
+          ,(pcase (length rx--pcase-vars)
+            (0
+             ;; No variables bound: a single predicate suffices.
+             `(pred (string-match ,regexp)))
+            (1
+             ;; Create a match value that on a successful regexp match
+             ;; is the submatch value, 0 on failure.  We can't use nil
+             ;; for failure because it is a valid submatch value.
+             `(app (lambda (s)
+                     (if (string-match ,regexp s)
+                         (match-string 1 s)
+                       0))
+                   (and ,(car rx--pcase-vars) (pred (not numberp)))))
+            (nvars
              ;; Pack the submatches into a dotted list which is then
              ;; immediately destructured into individual variables again.
-             ;; This is of course slightly inefficient when NVARS > 1.
+             ;; This is of course slightly inefficient.
              ;; A dotted list is used to reduce the number of conses
              ;; to create and take apart.
              `(app (lambda (s)
@@ -1463,7 +1473,7 @@ following constructs:
                           (rx--reduce-right
                            #'cons
                            (mapcar (lambda (name) (list '\, name))
-                                   (reverse rx--pcase-vars)))))))))
+                                   (reverse rx--pcase-vars))))))))))
 
 ;; Obsolete internal symbol, used in old versions of the `flycheck' package.
 (define-obsolete-function-alias 'rx-submatch-n 'rx-to-string "27.1")
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 9b31d68..4df4040 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -60,8 +60,10 @@ FUNCTIONS is a list of elements on the form:
    :args ARGS
    :eval EXAMPLE-FORM
    :no-eval EXAMPLE-FORM
+   :no-eval* EXAMPLE-FORM
    :no-value EXAMPLE-FORM
    :result RESULT-FORM
+   :result-string RESULT-FORM
    :eg-result RESULT-FORM
    :eg-result-string RESULT-FORM)
 
@@ -221,7 +223,7 @@ There can be any number of :example/:result elements."
   (string-greaterp
    :eval (string-greaterp "foo" "bar"))
   (string-version-lessp
-   :eval (string-lessp "foo32.png" "bar4.png"))
+   :eval (string-version-lessp "pic4.png" "pic32.png"))
   (string-prefix-p
    :eval (string-prefix-p "foo" "foobar"))
   (string-suffix-p
@@ -266,6 +268,9 @@ There can be any number of :example/:result elements."
    :eval (file-name-extension "/tmp/foo.txt"))
   (file-name-sans-extension
    :eval (file-name-sans-extension "/tmp/foo.txt"))
+  (file-name-with-extension
+   :eval (file-name-with-extension "foo.txt" "bin")
+   :eval (file-name-with-extension "foo" "bin"))
   (file-name-base
    :eval (file-name-base "/tmp/foo.txt"))
   (file-relative-name
@@ -613,7 +618,7 @@ There can be any number of :example/:result elements."
   (lax-plist-get
    :eval (lax-plist-get '("a" 1 "b" 2 "c" 3) "b"))
   (lax-plist-put
-   :no-eval (setq plist (plist-put plist "d" 4))
+   :no-eval (setq plist (lax-plist-put plist "d" 4))
    :eq-result '("a" 1 "b" 2 "c" 3 "d" 4))
   (plist-member
    :eval (plist-member '(a 1 b 2 c 3) 'b))
@@ -625,7 +630,7 @@ There can be any number of :example/:result elements."
   (length>
    :eval (length> '(a b c) 1))
   (length=
-   :eval (length> '(a b c) 3))
+   :eval (length= '(a b c) 3))
   (safe-length
    :eval (safe-length '(a b c))))
 
@@ -666,7 +671,7 @@ There can be any number of :example/:result elements."
    :no-eval (re-search-backward "^foo$" nil t)
    :eg-result 43)
   (looking-at-p
-   :no-eval (looking-at "f[0-9]")
+   :no-eval (looking-at-p "f[0-9]")
    :eg-result t)
   "Match Data"
   (match-string
@@ -838,7 +843,7 @@ There can be any number of :example/:result elements."
   (point
    :eval (point))
   (point-min
-   :eval (point-max))
+   :eval (point-min))
   (point-max
    :eval (point-max))
   (line-beginning-position
@@ -885,7 +890,53 @@ There can be any number of :example/:result elements."
   (lock-buffer
    :no-value (lock-buffer "/tmp/foo"))
   (unlock-buffer
-   :no-value (lock-buffer)))
+   :no-value (unlock-buffer)))
+
+(define-short-documentation-group overlay
+  "Predicates"
+  (overlayp
+   :no-eval (overlayp some-overlay)
+   :eg-result t)
+  "Creation and Deletion"
+  (make-overlay
+   :args (beg end &optional buffer)
+   :no-eval (make-overlay 1 10)
+   :eg-result-string "#<overlay from 1 to 10 in *foo*>")
+  (delete-overlay
+   :no-eval (delete-overlay foo)
+   :eg-result t)
+  "Searching Overlays"
+  (overlays-at
+   :no-eval (overlays-at 15)
+   :eg-result-string "(#<overlay from 1 to 10 in *foo*>)")
+  (overlays-in
+   :no-eval (overlays-in 1 30)
+   :eg-result-string "(#<overlay from 1 to 10 in *foo*>)")
+  (next-overlay-change
+   :no-eval (next-overlay-change 1)
+   :eg-result 20)
+  (previous-overlay-change
+   :no-eval (previous-overlay-change 30)
+   :eg-result 20)
+  "Overlay Properties"
+  (overlay-start
+   :no-eval (overlay-start foo)
+   :eg-result 1)
+  (overlay-end
+   :no-eval (overlay-end foo)
+   :eg-result 10)
+  (overlay-put
+   :no-eval (overlay-put foo 'happy t)
+   :eg-result t)
+  (overlay-get
+   :no-eval (overlay-get foo 'happy)
+   :eg-result t)
+  (overlay-buffer
+   :no-eval (overlay-buffer foo))
+  "Moving Overlays"
+  (move-overlay
+   :no-eval (move-overlay foo 5 20)
+   :eg-result-string "#<overlay from 5 to 20 in *foo*>"))
 
 (define-short-documentation-group process
   (make-process
@@ -1056,7 +1107,7 @@ There can be any number of :example/:result elements."
   (logb
    :eval (logb 10.5))
   (ffloor
-   :eval (floor 1.2))
+   :eval (ffloor 1.2))
   (fceiling
    :eval (fceiling 1.2))
   (ftruncate
@@ -1235,11 +1286,11 @@ Example:
   (let ((glist (assq group shortdoc--groups)))
     (unless glist
       (setq glist (list group))
-      (setq shortdoc--groups (append shortdoc--groups (list glist))))
+      (push glist shortdoc--groups))
     (let ((slist (member section glist)))
       (unless slist
         (setq slist (list section))
-        (setq slist (append glist slist)))
+        (nconc glist slist))
       (while (and (cdr slist)
                   (not (stringp (cadr slist))))
         (setq slist (cdr slist)))
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index 9c8c967..468d124 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -127,7 +127,7 @@ This is like `if-let' but doesn't handle a VARLIST of the 
form
 \(SYMBOL SOMETHING) specially."
   (declare (indent 2)
            (debug ((&rest [&or symbolp (symbolp form) (form)])
-                   form body)))
+                   body)))
   (if varlist
       `(let* ,(setq varlist (internal--build-bindings varlist))
          (if ,(caar (last varlist))
@@ -146,9 +146,7 @@ This is like `when-let' but doesn't handle a VARLIST of the 
form
   "Bind variables according to VARLIST and conditionally evaluate BODY.
 Like `when-let*', except if BODY is empty and all the bindings
 are non-nil, then the result is non-nil."
-  (declare (indent 1)
-           (debug ((&rest [&or symbolp (symbolp form) (form)])
-                   body)))
+  (declare (indent 1) (debug if-let*))
   (let (res)
     (if varlist
         `(let* ,(setq varlist (internal--build-bindings varlist))
@@ -174,9 +172,9 @@ As a special case, interprets a SPEC of the form \(SYMBOL 
SOMETHING)
 like \((SYMBOL SOMETHING)).  This exists for backward compatibility
 with an old syntax that accepted only one binding."
   (declare (indent 2)
-           (debug ([&or (&rest [&or symbolp (symbolp form) (form)])
-                        (symbolp form)]
-                   form body)))
+           (debug ([&or (symbolp form)  ; must be first, Bug#48489
+                        (&rest [&or symbolp (symbolp form) (form)])]
+                   body)))
   (when (and (<= (length spec) 2)
              (not (listp (car spec))))
     ;; Adjust the single binding case
@@ -289,6 +287,18 @@ than this function."
       (let ((result nil)
             (result-length 0)
             (index (if end (1- (length string)) 0)))
+        ;; FIXME: This implementation, which uses encode-coding-char
+        ;; to encode the string one character at a time, is in general
+        ;; incorrect: coding-systems that produce prefix or suffix
+        ;; bytes, such as ISO-2022-based or UTF-8/16 with BOM, will
+        ;; produce those bytes for each character, instead of just
+        ;; once for the entire string.  encode-coding-char attempts to
+        ;; remove those extra bytes at least in some situations, but
+        ;; it cannot do that in all cases.  And in any case, producing
+        ;; what is supposed to be a UTF-16 or ISO-2022-CN encoded
+        ;; string which lacks the BOM bytes at the beginning and the
+        ;; charset designation sequences at the head and tail of the
+        ;; result will definitely surprise the callers in some cases.
         (while (let ((encoded (encode-coding-char
                                (aref string index) coding-system)))
                  (and (<= (+ (length encoded) result-length) length)
@@ -307,6 +317,7 @@ than this function."
      (end (substring string (- (length string) length)))
      (t (substring string 0 length)))))
 
+;;;###autoload
 (defun string-lines (string &optional omit-nulls)
   "Split STRING into a list of lines.
 If OMIT-NULLS, empty lines will be removed from the results."
diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el
index 6d5b04b..0bb1b89 100644
--- a/lisp/emacs-lisp/syntax.el
+++ b/lisp/emacs-lisp/syntax.el
@@ -125,6 +125,10 @@ otherwise nil.  That construct can be a two character 
comment
 delimiter or an Escaped or Char-quoted character."))
 
 (defun syntax-propertize-wholelines (start end)
+  "Extend the region delimited by START and END to whole lines.
+This function is useful for
+`syntax-propertize-extend-region-functions';
+see Info node `(elisp) Syntax Properties'."
   (goto-char start)
   (cons (line-beginning-position)
         (progn (goto-char end)
diff --git a/lisp/emacs-lisp/text-property-search.el 
b/lisp/emacs-lisp/text-property-search.el
index 69943a8..7da02a9 100644
--- a/lisp/emacs-lisp/text-property-search.el
+++ b/lisp/emacs-lisp/text-property-search.el
@@ -31,28 +31,40 @@
 
 (defun text-property-search-forward (property &optional value predicate
                                               not-current)
-  "Search for the next region of text whose PROPERTY matches VALUE.
-
-If not found, return nil and don't move point.
-If found, move point to the start of the region and return a
-`prop-match' object describing the match.  To access the details
-of the match, use `prop-match-beginning' and `prop-match-end' for
-the buffer positions that limit the region, and
-`prop-match-value' for the value of PROPERTY in the region.
-
+  "Search for the next region of text where PREDICATE is true.
 PREDICATE is used to decide whether a value of PROPERTY should be
 considered as matching VALUE.
-If PREDICATE is t, that means a value must `equal' VALUE to be
-considered a match.
-If PREDICATE is nil, a value will match if it is non-nil and
-is NOT `equal' to VALUE.
+
 If PREDICATE is a function, it will be called with two arguments:
 VALUE and the value of PROPERTY.  The function should return
 non-nil if these two values are to be considered a match.
 
+Two special values of PREDICATE can also be used:
+If PREDICATE is t, that means a value must `equal' VALUE to be
+considered a match.
+If PREDICATE is nil (which is the default value), a value will
+match if is not `equal' to VALUE.  Furthermore, a nil PREDICATE
+means that the match region is ended if the value changes.  For
+instance, this means that if you loop with
+
+  (while (setq prop (text-property-search-forward 'face))
+    ...)
+
+you will get all distinct regions with non-nil `face' values in
+the buffer, and the `prop' object will have the details about the
+match.  See the manual for more details and examples about how
+VALUE and PREDICATE interact.
+
 If NOT-CURRENT is non-nil, the function will search for the first
 region that doesn't include point and has a value of PROPERTY
-that matches VALUE."
+that matches VALUE.
+
+If no matches can be found, return nil and don't move point.
+If found, move point to the end of the region and return a
+`prop-match' object describing the match.  To access the details
+of the match, use `prop-match-beginning' and `prop-match-end' for
+the buffer positions that limit the region, and
+`prop-match-value' for the value of PROPERTY in the region."
   (interactive
    (list
     (let ((string (completing-read "Search for property: " obarray)))
@@ -125,7 +137,7 @@ that matches VALUE."
   "Search for the previous region of text whose PROPERTY matches VALUE.
 
 Like `text-property-search-forward', which see, but searches backward,
-and if a matching region is found, place point at its end."
+and if a matching region is found, place point at the start of the region."
   (interactive
    (list
     (let ((string (completing-read "Search for property: " obarray)))
diff --git a/lisp/emacs-lisp/thunk.el b/lisp/emacs-lisp/thunk.el
index 83e0fa7..7e349d2 100644
--- a/lisp/emacs-lisp/thunk.el
+++ b/lisp/emacs-lisp/thunk.el
@@ -52,7 +52,7 @@
 
 (defmacro thunk-delay (&rest body)
   "Delay the evaluation of BODY."
-  (declare (debug t))
+  (declare (debug (def-body)))
   (cl-assert lexical-binding)
   `(let (forced
          (val (lambda () ,@body)))
diff --git a/lisp/epa-ks.el b/lisp/epa-ks.el
new file mode 100644
index 0000000..ebdb127
--- /dev/null
+++ b/lisp/epa-ks.el
@@ -0,0 +1,345 @@
+;;; epa-ks.el --- EasyPG Key Server Client -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Philip K. <philipk@posteo.net>
+;; Keywords: PGP, GnuPG
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Keyserver client in Emacs.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'epa)
+(require 'subr-x)
+(require 'tabulated-list)
+(require 'url)
+(require 'url-http)
+
+(defgroup epa-ks nil
+  "The EasyPG Assistant Keyserver client."
+  :version "28.1"
+  :group 'epa)
+
+(defcustom epa-keyserver "pgp.mit.edu"
+  "Domain of keyserver.
+
+This is used by `epa-ks-lookup-key', for looking up public keys."
+  :type '(choice :tag "Keyserver"
+                 (repeat :tag "Random pool"
+                         (string :tag "Keyserver address"))
+                 (const "keyring.debian.org")
+                 (const "keys.gnupg.net")
+                 (const "keyserver.ubuntu.com")
+                 (const "pgp.mit.edu")
+                 (const "pool.sks-keyservers.net")
+                 (const "zimmermann.mayfirst.org")
+                 (string :tag "Custom keyserver"))
+  :version "28.1")
+
+(cl-defstruct epa-ks-key
+  "Structure to hold key data."
+  id algo len created expires names flags)
+
+(cl-defstruct epa-ks-name
+  "Structure to hold user associated with keys data."
+  uid created expires flags)
+
+(defvar epa-ks-last-query nil
+  "List of arguments to pass to `epa-search-keys'.
+This is used when reverting a buffer to restart search.")
+
+(defvar epa-ks-search-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map (kbd "f") #'epa-ks-mark-key-to-fetch)
+    (define-key map (kbd "i") #'epa-ks-inspect-key-to-fetch)
+    (define-key map (kbd "u") #'epa-ks-unmark-key-to-fetch)
+    (define-key map (kbd "x") #'epa-ks-do-key-to-fetch)
+    map))
+
+(define-derived-mode epa-ks-search-mode tabulated-list-mode "Keyserver"
+  "Major mode for listing public key search results."
+  (buffer-disable-undo)
+  (setq tabulated-list-format [("ID" 8 t)
+                               ("Algo." 5 nil)
+                               ("Created" 10 t)
+                               ("Expires" 10 t)
+                               ("User" 0 t)]
+        tabulated-list-sort-key '("User" . nil)
+        tabulated-list-padding 2)
+  (add-hook 'tabulated-list-revert-hook
+            #'epa-ks--restart-search
+            nil t)
+  (tabulated-list-init-header))
+
+(defun epa-ks-inspect-key-to-fetch ()
+  "Display full ID of key under point in the minibuffer."
+  (interactive)
+  (message "Full ID: %s" (epa-ks-key-id (car (tabulated-list-get-id)))))
+
+(defun epa-ks-unmark-key-to-fetch ()
+  "Remove fetch mark for key under point.
+
+If a region is active, unmark all keys in active region."
+  (interactive)
+  (epa-ks-mark-key-to-fetch ""))
+
+(defun epa-ks-mark-key-to-fetch (tag)
+  "Add fetch-mark to key under point.
+
+If a region is active, mark all keys in active region.
+
+When all keys have been selected, use \\[epa-ks-do-key-to-fetch] to
+actually import the keys.
+
+When called interactively, `epa-ks-mark-key-to-fetch' will always
+add a \"F\" tag.  Non-interactivly the tag must be specified by
+setting the TAG parameter."
+  (interactive (list "F"))
+  (if (region-active-p)
+      (save-mark-and-excursion
+        (save-restriction
+          (narrow-to-region (region-beginning) (1- (region-end)))
+          (goto-char (point-min))
+          (while (not (eobp))
+            (tabulated-list-put-tag tag t))))
+    (tabulated-list-put-tag tag t)))
+
+(defun epa-ks-do-key-to-fetch ()
+  "Fetch all marked keys from keyserver and import them.
+
+Keys are marked using `epa-ks-mark-key-to-fetch'."
+  (interactive)
+  (save-excursion
+    (let (keys)
+      (goto-char (point-min))
+      (while (not (eobp))
+        (when (looking-at-p (rx bol "F"))
+          (push (epa-ks-key-id (car (tabulated-list-get-id)))
+                keys))
+        (forward-line))
+      (when (yes-or-no-p (format "Proceed with fetching all %d key(s)? "
+                                 (length keys))))
+      (dolist (id keys)
+        (epa-ks--fetch-key id))))
+  (tabulated-list-clear-all-tags))
+
+(defun epa-ks--query-url (query exact)
+  "Return URL for QUERY.
+If EXACT is non-nil, don't accept approximate matches."
+  (format "https://%s/pks/lookup?%s";
+          (cond ((null epa-keyserver)
+                 (user-error "Empty keyserver pool"))
+                ((listp epa-keyserver)
+                 (nth (random (length epa-keyserver))
+                      epa-keyserver))
+                ((stringp epa-keyserver)
+                 epa-keyserver)
+                ((error "Invalid type for `epa-keyserver'")))
+          (url-build-query-string
+           (append `(("search" ,query)
+                     ("options" "mr")
+                     ("op" "index"))
+                   (and exact '(("exact" "on")))))))
+
+(defun epa-ks--fetch-key (id)
+  "Send request to import key with specified ID."
+  (url-retrieve
+   (epa-ks--query-url (concat "0x" (url-hexify-string id)) t)
+   (lambda (status)
+     (when (plist-get status :error)
+       (error "Request failed: %s"
+              (caddr (assq (caddr (plist-get status :error))
+                           url-http-codes))))
+     (forward-paragraph)
+     (save-excursion
+       (goto-char (point-max))
+       (while (memq (char-before) '(?\s ?\t ?\n))
+         (forward-char -1))
+       (delete-region (point) (point-max)))
+     (let ((epa-popup-info-window nil))
+       (epa-import-armor-in-region (point) (point-max)))
+     (kill-buffer))))
+
+(defun epa-ks--display-keys (buf keys)
+  "Prepare KEYS for `tabulated-list-mode', for buffer BUF.
+
+KEYS is a list of `epa-ks-key' structures, as parsed by
+`epa-ks-parse-result'."
+  (when (buffer-live-p buf)
+    (let (entries)
+      (dolist (key keys)
+        (dolist (name (epa-ks-key-names key))
+          (push (list (cons key name)
+                      (vector
+                       (substring (epa-ks-key-id key) -8)
+                       (cdr (epa-ks-key-algo key))
+                       (if (epa-ks-key-created key)
+                           (format-time-string "%F" (epa-ks-key-created key))
+                         "N/A")
+                       (if (epa-ks-key-expires key)
+                           (let* ((date (epa-ks-key-expires key))
+                                  (str (format-time-string "%F" date)))
+                             (when (< 0 (time-to-seconds (time-since date)))
+                               (setq str (propertize str 'face
+                                                     'font-lock-warning-face)))
+                             str)
+                         (propertize "N/A" 'face 'shadow))
+                       (decode-coding-string
+                        (epa-ks-name-uid name)
+                        (select-safe-coding-system (epa-ks-name-uid name)
+                                                   nil 'utf-8))))
+                entries)))
+      (with-current-buffer buf
+        (setq tabulated-list-entries entries)
+        (tabulated-list-print t t))
+      (message "Press `f' to mark a key, `x' to fetch all marked keys."))))
+
+(defun epa-ks--restart-search ()
+  (when epa-ks-last-query
+    (apply #'epa-search-keys epa-ks-last-query)))
+
+;;;###autoload
+(defun epa-search-keys (query exact)
+  "Ask a keyserver for all keys matching QUERY.
+
+The keyserver to be used is specified by `epa-keyserver'.
+
+If EXACT is non-nil (interactively, prefix argument), require
+exact matches.
+
+Note that the request may fail if the query is not specific
+enough, since keyservers have strict timeout settings."
+  (interactive (list (read-string "Search for: ")
+                     current-prefix-arg))
+  (when (string-empty-p query)
+    (user-error "No query"))
+  (let ((buf (get-buffer-create "*Key search*")))
+    (with-current-buffer buf
+      (let ((inhibit-read-only t))
+        (erase-buffer))
+      (epa-ks-search-mode))
+    (url-retrieve
+     (epa-ks--query-url query exact)
+     (lambda (status)
+       (when (plist-get status :error)
+         (when buf
+           (kill-buffer buf))
+         (error "Request failed: %s"
+                (caddr (assq (caddr (plist-get status :error))
+                             url-http-codes))))
+       (goto-char (point-min))
+       (while (search-forward "\r\n" nil t)
+         (replace-match "\n" t t))
+       (goto-char (point-min))
+       (re-search-forward "\n\n")
+       (let (keys)
+         (save-match-data
+           (setq keys (epa-ks--parse-buffer))
+           (kill-buffer (current-buffer)))
+         (when buf
+           (epa-ks--display-keys buf keys) keys))))
+    (pop-to-buffer buf)
+    (setq epa-ks-last-query (list query exact)))
+  (message "Searching keys..."))
+
+(defun epa-ks--parse-buffer ()
+  ;; parse machine readable response according to
+  ;; https://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-5.2
+  (when (looking-at (rx bol "info:" (group (+ digit))
+                        ":" (* digit) eol))
+    (unless (string= (match-string 1) "1")
+      (error "Unsupported keyserver version")))
+  (forward-line 1)
+  (let (key keys)
+    (while (and (not (eobp))
+                (not (looking-at "[ \t]*\n")))
+      (cond
+       ((looking-at (rx bol "pub:" (group (+ alnum))
+                        ":" (group (* digit))
+                        ":" (group (* digit))
+                        ":" (group (* digit))
+                        ":" (group (* digit))
+                        ":" (group (* (any ?r ?d ?e)))
+                        eol))
+        (setq key
+              (make-epa-ks-key
+               :id (match-string 1)
+               :algo
+               (and (match-string 2)
+                    (not (string-empty-p (match-string 2)))
+                    (assoc (string-to-number (match-string 2))
+                           epg-pubkey-algorithm-alist))
+               :len
+               (and (match-string 3)
+                    (not (string-empty-p (match-string 3)))
+                    (string-to-number (match-string 3)))
+               :created
+               (and  (match-string 4)
+                     (not (string-empty-p (match-string 4)))
+                     (seconds-to-time
+                      (string-to-number (match-string 4))))
+               :expires
+               (and (match-string 5)
+                    (not (string-empty-p (match-string 5)))
+                    (seconds-to-time
+                     (string-to-number (match-string 5))))
+               :flags
+               (mapcar (lambda (flag)
+                         (cdr (assq flag '((?r revoked)
+                                           (?d disabled)
+                                           (?e expired)))))
+                       (match-string 6))))
+        (push key keys))
+       ((looking-at (rx bol "uid:" (group (+ (not ":")))
+                        ":" (group (* digit))
+                        ":" (group (* digit))
+                        ":" (group (* (any ?r ?d ?e)))
+                        eol))
+        (push (make-epa-ks-name
+               :uid (url-unhex-string (match-string 1) t)
+               :created
+               (and (match-string 2)
+                    (not (string-empty-p (match-string 2)))
+                    (decode-time (seconds-to-time
+                                  (string-to-number
+                                   (match-string 2)))))
+               :expires
+               (and (match-string 3)
+                    (not (string-empty-p (match-string 3)))
+                    (decode-time (seconds-to-time
+                                  (string-to-number
+                                   (match-string 3)))))
+               :flags
+               (mapcar (lambda (flag)
+                         (cdr (assq flag '((?r revoked)
+                                           (?d disabled)
+                                           (?e expired)))))
+                       (match-string 4)))
+              (epa-ks-key-names key)))
+       ((looking-at-p (rx bol "uat:"))
+        ;; user attribute fields are ignored
+        nil)
+       (t (error "Invalid server response")))
+      (forward-line))
+    keys))
+
+;;; epa-ks.el ends here
diff --git a/lisp/epa-mail.el b/lisp/epa-mail.el
index 7eac1f8..bed0c06 100644
--- a/lisp/epa-mail.el
+++ b/lisp/epa-mail.el
@@ -108,8 +108,9 @@ use from your key ring."
   (interactive
    (save-excursion
      (goto-char (point-min))
-     (if (search-forward mail-header-separator nil t)
-        (forward-line))
+     (rfc822-goto-eoh)
+     (unless (eobp)
+       (forward-line))
      (setq epa-last-coding-system-specified
           (or coding-system-for-write
               (select-safe-coding-system (point) (point-max))))
@@ -135,9 +136,7 @@ If no one is selected, default secret key is used.  "
       (goto-char (point-min))
       (save-restriction
        (narrow-to-region (point)
-                         (if (search-forward mail-header-separator nil 0)
-                             (match-beginning 0)
-                           (point)))
+                          (progn (rfc822-goto-eoh) (point)))
        (setq recipients-string
              (mapconcat #'identity
                         (nconc (mail-fetch-field "to" nil nil t)
@@ -170,7 +169,7 @@ If no one is selected, default secret key is used.  "
            (apply #'nconc
                   (mapcar
                    (lambda (recipient)
-                     (let ((tem (assoc recipient epa-mail-aliases)))
+                     (let ((tem (assoc (downcase recipient) epa-mail-aliases)))
                        (if tem (copy-sequence (cdr tem))
                          (list recipient))))
                    real-recipients)))
@@ -236,8 +235,9 @@ If no one is selected, symmetric encryption will be 
performed.  "
                       default-recipients)))))
 
       (goto-char (point-min))
-      (if (search-forward mail-header-separator nil t)
-         (forward-line))
+      (rfc822-goto-eoh)
+      (unless (eobp)
+       (forward-line))
       (setq start (point))
 
       (setq epa-last-coding-system-specified
diff --git a/lisp/epa.el b/lisp/epa.el
index bbfa2c1..2698b39 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -333,7 +333,10 @@ If ARG is non-nil, mark the key."
     (insert
      (propertize
       (concat "  " (epa--button-key-text key))
-      'epa-key key))
+      'epa-key key
+      ;; Allow TAB to tab to the key.
+      'button t
+      'category t))
     (insert "\n")))
 
 (defun epa--list-keys (name secret &optional doc)
diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el
index 09d1f7a..073d164 100644
--- a/lisp/erc/erc-services.el
+++ b/lisp/erc/erc-services.el
@@ -32,8 +32,8 @@
 
 ;; As a default, ERC has the data for the official nickname services on
 ;; the networks Austnet, BrasNET, Dalnet, freenode, GalaxyNet, GRnet,
-;; and Slashnet.  You can add more by using M-x customize-variable RET
-;; erc-nickserv-alist.
+;; Libera.Chat and Slashnet.  You can add more by using
+;;   M-x customize-variable RET erc-nickserv-alist.
 
 ;; Usage:
 ;;
@@ -197,6 +197,7 @@ Example of use:
                        (const GalaxyNet)
                        (const GRnet)
                        (const iip)
+                        (const Libera.Chat)
                        (const OFTC)
                        (const QuakeNet)
                        (const Rizon)
@@ -264,6 +265,15 @@ Example of use:
      "type\\s-/squery\\s-Trent\\s-identify\\s-<password>"
      "Trent@anon.iip"
      "IDENTIFY" nil "SQUERY" nil)
+    (Libera.Chat
+     "NickServ!NickServ@services.libera.chat"
+     ;; Libera.Chat also accepts a password at login, see the `erc'
+     ;; :password argument.
+     "This\\s-nickname\\s-is\\s-registered.\\s-Please\\s-choose"
+     "NickServ"
+     "IDENTIFY" nil nil
+     ;; See also the 901 response code message.
+     "You\\s-are\\s-now\\s-identified\\s-for\\s-")
     (OFTC
      "NickServ!services@services.oftc.net"
      ;; OFTC's NickServ doesn't ask you to identify anymore.
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 6717ee3..5245204 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -2225,7 +2225,7 @@ Non-interactively, it takes the keyword arguments
 
 That is, if called with
 
-   (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
+   (erc :server \"chat.freenode.net\" :full-name \"J. Random Hacker\")
 
 then the server and full-name will be set to those values,
 whereas `erc-compute-port' and `erc-compute-nick' will be invoked
@@ -2260,7 +2260,7 @@ Non-interactively, it takes the keyword arguments
 
 That is, if called with
 
-   (erc-tls :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
+   (erc-tls :server \"chat.freenode.net\" :full-name \"J. Random Hacker\")
 
 then the server and full-name will be set to those values,
 whereas `erc-compute-port' and `erc-compute-nick' will be invoked
@@ -2278,8 +2278,8 @@ Example usage:
 
     (erc-tls :server \"chat.freenode.net\" :port 6697
              :client-certificate
-             '(\"/data/bandali/my-cert.key\"
-               \"/data/bandali/my-cert.crt\"))"
+             '(\"/home/bandali/my-cert.key\"
+               \"/home/bandali/my-cert.crt\"))"
   (interactive (let ((erc-default-port erc-default-port-tls))
                 (erc-select-read-args)))
   (let ((erc-server-connect-function 'erc-open-tls-stream))
diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
index e559f5b..18e19a9 100644
--- a/lisp/eshell/em-hist.el
+++ b/lisp/eshell/em-hist.el
@@ -379,7 +379,7 @@ input."
              (if (eq eshell-hist-ignoredups 'erase)
                  ;; Remove any old occurrences of the input, and put
                  ;; the new one at the end.
-                 (progn
+                 (unless (ring-empty-p eshell-history-ring)
                    (ring-remove eshell-history-ring
                                (ring-member eshell-history-ring input))
                    t)
diff --git a/lisp/eshell/em-pred.el b/lisp/eshell/em-pred.el
index 0780d6e..def52f4 100644
--- a/lisp/eshell/em-pred.el
+++ b/lisp/eshell/em-pred.el
@@ -63,8 +63,7 @@ ordinary strings."
 (defcustom eshell-pred-load-hook nil
   "A list of functions to run when `eshell-pred' is loaded."
   :version "24.1"                      ; removed eshell-pred-initialize
-  :type 'hook
-  :group 'eshell-pred)
+  :type 'hook)
 
 (defcustom eshell-predicate-alist
   '((?/ . (eshell-pred-file-type ?d))   ; directories
@@ -108,8 +107,7 @@ ordinary strings."
 The format of each entry is
 
   (CHAR . PREDICATE-FUNC-SEXP)"
-  :type '(repeat (cons character sexp))
-  :group 'eshell-pred)
+  :type '(repeat (cons character sexp)))
 
 (put 'eshell-predicate-alist 'risky-local-variable t)
 
@@ -146,8 +144,7 @@ The format of each entry is
 The format of each entry is
 
   (CHAR ENTRYWISE-P MODIFIER-FUNC-SEXP)"
-  :type '(repeat (cons character sexp))
-  :group 'eshell-pred)
+  :type '(repeat (cons character sexp)))
 
 (put 'eshell-modifier-alist 'risky-local-variable t)
 
@@ -297,9 +294,9 @@ This function is specially for adding onto 
`eshell-parse-argument-hook'."
                        (append
                         eshell-current-modifiers
                         (list
-                         `(lambda (lst)
-                            (eshell-apply-modifiers
-                             lst (quote ,preds) (quote ,mods)))))))))
+                         (lambda (lst)
+                           (eshell-apply-modifiers
+                            lst preds mods))))))))
          (goto-char (1+ end))
          (eshell-finish-arg))))))
 
@@ -324,7 +321,7 @@ resultant list of strings."
              (if (looking-at "[^|':]")
                  (let ((func (read (current-buffer))))
                    (if (and func (functionp func))
-                       (setq preds (eshell-add-pred-func func preds
+                       (setq preds (eshell-add-pred-func (eval func t) preds
                                                          negate follow))
                      (error "Invalid function predicate `%s'"
                             (eshell-stringify func))))
@@ -341,8 +338,7 @@ resultant list of strings."
                  (let ((func (read (current-buffer))))
                    (if (and func (functionp func))
                        (setq mods
-                             (cons `(lambda (lst)
-                                      (mapcar (function ,func) lst))
+                             (cons (lambda (lst) (mapcar func lst))
                                    mods))
                      (error "Invalid function modifier `%s'"
                             (eshell-stringify func))))
@@ -353,14 +349,14 @@ resultant list of strings."
                (if (not mod)
                    (error "Unknown modifier character `%c'" (char-after))
                  (forward-char)
-                 (setq mods (cons (eval (cdr mod)) mods)))))
+                 (setq mods (cons (eval (cdr mod) t) mods)))))
             (t
              (let ((pred (assq char eshell-predicate-alist)))
                (if (not pred)
                    (error "Unknown predicate character `%c'" char)
                  (forward-char)
                  (setq preds
-                       (eshell-add-pred-func (eval (cdr pred)) preds
+                       (eshell-add-pred-func (eval (cdr pred) t) preds
                                              negate follow))))))))
       (end-of-buffer
        (error "Predicate or modifier ended prematurely")))
@@ -369,11 +365,11 @@ resultant list of strings."
 (defun eshell-add-pred-func (pred funcs negate follow)
   "Add the predicate function PRED to FUNCS."
   (if negate
-      (setq pred `(lambda (file)
-                   (not (funcall ,pred file)))))
+      (setq pred (lambda (file)
+                  (not (funcall pred file)))))
   (if follow
-      (setq pred `(lambda (file)
-                   (funcall ,pred (file-truename file)))))
+      (setq pred (lambda (file)
+                  (funcall pred (file-truename file)))))
   (cons pred funcs))
 
 (defun eshell-pred-user-or-group (mod-char mod-type attr-index get-id-func)
@@ -399,10 +395,10 @@ resultant list of strings."
     (unless ugid
       (error "Unknown %s name specified for modifier `%c'"
             mod-type mod-char))
-    `(lambda (file)
-       (let ((attrs (file-attributes file)))
-        (if attrs
-            (= (nth ,attr-index attrs) ,ugid))))))
+    (lambda (file)
+      (let ((attrs (file-attributes file)))
+       (if attrs
+           (= (nth attr-index attrs) ugid))))))
 
 (defun eshell-pred-file-time (mod-char mod-type attr-index)
   "Return a predicate to test whether a file matches a certain time."
@@ -445,13 +441,13 @@ resultant list of strings."
          (error "Cannot stat file `%s'" file))
        (setq when (nth attr-index attrs)))
       (goto-char (1+ end)))
-    `(lambda (file)
-       (let ((attrs (file-attributes file)))
-        (if attrs
-             (,(cond ((eq qual ?-) #'time-less-p)
+    (let ((f (cond ((eq qual ?-) #'time-less-p)
                      ((eq qual ?+) (lambda (a b) (time-less-p b a)))
-                     (#'time-equal-p))
-             ,when (nth ,attr-index attrs)))))))
+                     (#'time-equal-p))))
+      (lambda (file)
+       (let ((attrs (file-attributes file)))
+         (if attrs
+              (funcall f when (nth attr-index attrs))))))))
 
 (defun eshell-pred-file-type (type)
   "Return a test which tests that the file is of a certain TYPE.
@@ -462,20 +458,20 @@ that `ls -l' will show in the first column of its 
display."
     (if (memq type '(?b ?c))
        (forward-char)
       (setq type ?%)))
-  `(lambda (file)
-     (let ((attrs (eshell-file-attributes (directory-file-name file))))
-       (if attrs
-          (memq (aref (file-attribute-modes attrs) 0)
-                ,(if (eq type ?%)
-                     '(?b ?c)
-                   (list 'quote (list type))))))))
+  (let ((set (if (eq type ?%)
+                '(?b ?c)
+              (list type))))
+    (lambda (file)
+      (let ((attrs (eshell-file-attributes (directory-file-name file))))
+       (if attrs
+           (memq (aref (file-attribute-modes attrs) 0) set))))))
 
 (defsubst eshell-pred-file-mode (mode)
   "Return a test which tests that MODE pertains to the file."
-  `(lambda (file)
-     (let ((modes (file-modes file 'nofollow)))
-       (if modes
-          (not (zerop (logand ,mode modes)))))))
+  (lambda (file)
+    (let ((modes (file-modes file 'nofollow)))
+      (if modes
+         (not (zerop (logand mode modes)))))))
 
 (defun eshell-pred-file-links ()
   "Return a predicate to test whether a file has a given number of links."
@@ -487,15 +483,15 @@ that `ls -l' will show in the first column of its 
display."
       (error "Invalid file link count modifier `l'"))
     (setq amount (string-to-number (match-string 0)))
     (goto-char (match-end 0))
-    `(lambda (file)
-       (let ((attrs (eshell-file-attributes file)))
-        (if attrs
-            (,(if (eq qual ?-)
-                  '<
-                (if (eq qual ?+)
-                    '>
-                  '=))
-             (file-attribute-link-number attrs) ,amount))))))
+    (let ((f (if (eq qual ?-)
+                #'<
+              (if (eq qual ?+)
+                  #'>
+                #'=))))
+      (lambda (file)
+       (let ((attrs (eshell-file-attributes file)))
+         (if attrs
+             (funcall f (file-attribute-link-number attrs) amount)))))))
 
 (defun eshell-pred-file-size ()
   "Return a predicate to test whether a file is of a given size."
@@ -517,15 +513,15 @@ that `ls -l' will show in the first column of its 
display."
       (error "Invalid file size modifier `L'"))
     (setq amount (* (string-to-number (match-string 0)) quantum))
     (goto-char (match-end 0))
-    `(lambda (file)
-       (let ((attrs (eshell-file-attributes file)))
-        (if attrs
-            (,(if (eq qual ?-)
-                  '<
-                (if (eq qual ?+)
-                    '>
-                  '=))
-             (file-attribute-size attrs) ,amount))))))
+    (let ((f (if (eq qual ?-)
+                #'<
+              (if (eq qual ?+)
+                  #'>
+                #'=))))
+      (lambda (file)
+       (let ((attrs (eshell-file-attributes file)))
+         (if attrs
+             (funcall f (file-attribute-size attrs) amount)))))))
 
 (defun eshell-pred-substitute (&optional repeat)
   "Return a modifier function that will substitute matches."
@@ -539,22 +535,22 @@ that `ls -l' will show in the first column of its 
display."
          replace (buffer-substring-no-properties (point) end))
     (goto-char (1+ end))
     (if repeat
-       `(lambda (lst)
-          (mapcar
-            (lambda (str)
-              (let ((i 0))
-                (while (setq i (string-match ,match str i))
-                  (setq str (replace-match ,replace t nil str))))
-              str)
-            lst))
-      `(lambda (lst)
-        (mapcar
-          (lambda (str)
-            (if (string-match ,match str)
-                (setq str (replace-match ,replace t nil str))
-              (error (concat str ": substitution failed")))
-            str)
-          lst)))))
+       (lambda (lst)
+         (mapcar
+           (lambda (str)
+             (let ((i 0))
+               (while (setq i (string-match match str i))
+                 (setq str (replace-match replace t nil str))))
+             str)
+           lst))
+      (lambda (lst)
+       (mapcar
+         (lambda (str)
+           (if (string-match match str)
+               (setq str (replace-match replace t nil str))
+             (error (concat str ": substitution failed")))
+           str)
+         lst)))))
 
 (defun eshell-include-members (&optional invert-p)
   "Include only lisp members matching a regexp."
@@ -564,12 +560,12 @@ that `ls -l' will show in the first column of its 
display."
     (setq end (eshell-find-delimiter delim delim nil nil t)
          regexp (buffer-substring-no-properties (point) end))
     (goto-char (1+ end))
-    `(lambda (lst)
-       (eshell-winnow-list
-       lst nil '((lambda (elem)
-                   ,(if invert-p
-                        `(not (string-match ,regexp elem))
-                      `(string-match ,regexp elem))))))))
+    (let ((predicates
+          (list (if invert-p
+                    (lambda (elem) (not (string-match regexp elem)))
+                  (lambda (elem) (string-match regexp elem))))))
+      (lambda (lst)
+       (eshell-winnow-list lst nil predicates)))))
 
 (defun eshell-join-members ()
   "Return a modifier function that join matches."
@@ -581,8 +577,8 @@ that `ls -l' will show in the first column of its display."
       (setq end (eshell-find-delimiter delim delim nil nil t)
            str (buffer-substring-no-properties (point) end))
       (goto-char (1+ end)))
-    `(lambda (lst)
-       (mapconcat 'identity lst ,str))))
+    (lambda (lst)
+      (mapconcat #'identity lst str))))
 
 (defun eshell-split-members ()
   "Return a modifier function that splits members."
@@ -593,10 +589,11 @@ that `ls -l' will show in the first column of its 
display."
       (setq end (eshell-find-delimiter delim delim nil nil t)
            sep (buffer-substring-no-properties (point) end))
       (goto-char (1+ end)))
-    `(lambda (lst)
-       (mapcar
-        (lambda (str)
-          (split-string str ,sep)) lst))))
+    (lambda (lst)
+      (mapcar
+       (lambda (str)
+         (split-string str sep))
+       lst))))
 
 (provide 'em-pred)
 
diff --git a/lisp/facemenu.el b/lisp/facemenu.el
index 8db1b42..855ce0b 100644
--- a/lisp/facemenu.el
+++ b/lisp/facemenu.el
@@ -91,12 +91,11 @@
   :prefix "facemenu-")
 
 (defcustom facemenu-keybindings
-  (mapcar 'purecopy
   '((default     . "d")
     (bold        . "b")
     (italic      . "i")
-    (bold-italic . "l") ; {bold} intersect {italic} = {l}
-    (underline   . "u")))
+    (bold-italic . "l")              ; {bold} intersect {italic} = {l}
+    (underline   . "u"))
   "Alist of interesting faces and keybindings.
 Each element is itself a list: the car is the name of the face,
 the next element is the key to use as a keyboard equivalent of the menu item;
@@ -147,7 +146,7 @@ it will remove any faces not explicitly in the list."
 
 (defvar facemenu-face-menu
   (let ((map (make-sparse-keymap "Face")))
-    (define-key map "o" (cons (purecopy "Other...") 'facemenu-set-face))
+    (define-key map "o" (cons "Other..." 'facemenu-set-face))
     map)
   "Menu keymap for faces.")
 (defalias 'facemenu-face-menu facemenu-face-menu)
@@ -155,7 +154,7 @@ it will remove any faces not explicitly in the list."
 
 (defvar facemenu-foreground-menu
   (let ((map (make-sparse-keymap "Foreground Color")))
-    (define-key map "o" (cons (purecopy "Other...") 'facemenu-set-foreground))
+    (define-key map "o" (cons "Other..." 'facemenu-set-foreground))
     map)
   "Menu keymap for foreground colors.")
 (defalias 'facemenu-foreground-menu facemenu-foreground-menu)
@@ -163,7 +162,7 @@ it will remove any faces not explicitly in the list."
 
 (defvar facemenu-background-menu
   (let ((map (make-sparse-keymap "Background Color")))
-    (define-key map "o" (cons (purecopy "Other...") 'facemenu-set-background))
+    (define-key map "o" (cons "Other..." 'facemenu-set-background))
     map)
   "Menu keymap for background colors.")
 (defalias 'facemenu-background-menu facemenu-background-menu)
@@ -186,27 +185,22 @@ return a string which is inserted.  It may set 
`facemenu-end-add-face'."
 
 (defvar facemenu-special-menu
   (let ((map (make-sparse-keymap "Special")))
-    (define-key map [?s] (cons (purecopy "Remove Special")
-                              'facemenu-remove-special))
-    (define-key map [?c] (cons (purecopy "Charset")
-                              'facemenu-set-charset))
-    (define-key map [?t] (cons (purecopy "Intangible")
-                              'facemenu-set-intangible))
-    (define-key map [?v] (cons (purecopy "Invisible")
-                              'facemenu-set-invisible))
-    (define-key map [?r] (cons (purecopy "Read-Only")
-                              'facemenu-set-read-only))
+    (define-key map [?s] (cons "Remove Special" 'facemenu-remove-special))
+    (define-key map [?c] (cons "Charset" 'facemenu-set-charset))
+    (define-key map [?t] (cons "Intangible" 'facemenu-set-intangible))
+    (define-key map [?v] (cons "Invisible" 'facemenu-set-invisible))
+    (define-key map [?r] (cons "Read-Only" 'facemenu-set-read-only))
     map)
   "Menu keymap for non-face text-properties.")
 (defalias 'facemenu-special-menu facemenu-special-menu)
 
 (defvar facemenu-justification-menu
   (let ((map (make-sparse-keymap "Justification")))
-    (define-key map [?c] (cons (purecopy "Center") 'set-justification-center))
-    (define-key map [?b] (cons (purecopy "Full") 'set-justification-full))
-    (define-key map [?r] (cons (purecopy "Right") 'set-justification-right))
-    (define-key map [?l] (cons (purecopy "Left") 'set-justification-left))
-    (define-key map [?u] (cons (purecopy "Unfilled") 'set-justification-none))
+    (define-key map [?c] (cons "Center" 'set-justification-center))
+    (define-key map [?b] (cons "Full" 'set-justification-full))
+    (define-key map [?r] (cons "Right" 'set-justification-right))
+    (define-key map [?l] (cons "Left" 'set-justification-left))
+    (define-key map [?u] (cons "Unfilled" 'set-justification-none))
     map)
   "Submenu for text justification commands.")
 (defalias 'facemenu-justification-menu facemenu-justification-menu)
@@ -214,13 +208,13 @@ return a string which is inserted.  It may set 
`facemenu-end-add-face'."
 (defvar facemenu-indentation-menu
   (let ((map (make-sparse-keymap "Indentation")))
     (define-key map [decrease-right-margin]
-      (cons (purecopy "Indent Right Less") 'decrease-right-margin))
+      (cons "Indent Right Less" 'decrease-right-margin))
     (define-key map [increase-right-margin]
-      (cons (purecopy "Indent Right More") 'increase-right-margin))
+      (cons "Indent Right More" 'increase-right-margin))
     (define-key map [decrease-left-margin]
-      (cons (purecopy "Indent Less") 'decrease-left-margin))
+      (cons "Indent Less" 'decrease-left-margin))
     (define-key map [increase-left-margin]
-      (cons (purecopy "Indent More") 'increase-left-margin))
+      (cons "Indent More" 'increase-left-margin))
     map)
   "Submenu for indentation commands.")
 (defalias 'facemenu-indentation-menu facemenu-indentation-menu)
@@ -230,36 +224,33 @@ return a string which is inserted.  It may set 
`facemenu-end-add-face'."
   "Facemenu top-level menu keymap.")
 (setq facemenu-menu (make-sparse-keymap "Text Properties"))
 (let ((map facemenu-menu))
-  (define-key map [dc] (cons (purecopy "Display Colors") 'list-colors-display))
-  (define-key map [df] (cons (purecopy "Display Faces") 'list-faces-display))
-  (define-key map [dp] (cons (purecopy "Describe Properties")
-                            'describe-text-properties))
-  (define-key map [ra] (list 'menu-item (purecopy "Remove Text Properties")
+  (define-key map [dc] (cons "Display Colors" 'list-colors-display))
+  (define-key map [df] (cons "Display Faces" 'list-faces-display))
+  (define-key map [dp] (cons "Describe Properties" 'describe-text-properties))
+  (define-key map [ra] (list 'menu-item "Remove Text Properties"
                             'facemenu-remove-all
                             :enable 'mark-active))
-  (define-key map [rm] (list 'menu-item (purecopy "Remove Face Properties")
+  (define-key map [rm] (list 'menu-item "Remove Face Properties"
                             'facemenu-remove-face-props
                             :enable 'mark-active))
-  (define-key map [s1] (list (purecopy "--"))))
+  (define-key map [s1] (list "--")))
 (let ((map facemenu-menu))
-  (define-key map [in] (cons (purecopy "Indentation")
-                            'facemenu-indentation-menu))
-  (define-key map [ju] (cons (purecopy "Justification")
-                            'facemenu-justification-menu))
-  (define-key map [s2] (list (purecopy "--")))
-  (define-key map [sp] (cons (purecopy "Special Properties")
-                            'facemenu-special-menu))
-  (define-key map [bg] (cons (purecopy "Background Color")
-                            'facemenu-background-menu))
-  (define-key map [fg] (cons (purecopy "Foreground Color")
-                            'facemenu-foreground-menu))
-  (define-key map [fc] (cons (purecopy "Face")
-                            'facemenu-face-menu)))
+  (define-key map [in] (cons "Indentation" 'facemenu-indentation-menu))
+  (define-key map [ju] (cons "Justification" 'facemenu-justification-menu))
+  (define-key map [s2] (list "--"))
+  (define-key map [sp] (cons "Special Properties" 'facemenu-special-menu))
+  (define-key map [bg] (cons "Background Color" 'facemenu-background-menu))
+  (define-key map [fg] (cons "Foreground Color" 'facemenu-foreground-menu))
+  (define-key map [fc] (cons "Face" 'facemenu-face-menu)))
 (defalias 'facemenu-menu facemenu-menu)
 
+(easy-menu-add-item
+ menu-bar-edit-menu nil
+ ["Text Properties" facemenu-menu])
+
 (defvar facemenu-keymap
   (let ((map (make-sparse-keymap "Set face")))
-    (define-key map "o" (cons (purecopy "Other...") 'facemenu-set-face))
+    (define-key map "o" (cons "Other..." 'facemenu-set-face))
     (define-key map "\M-o" 'font-lock-fontify-block)
     map)
   "Keymap for face-changing commands.
@@ -819,11 +810,11 @@ This is called whenever you create a new face, and at 
other times."
            symbol (intern name)))
     (setq menu 'facemenu-face-menu)
     (setq docstring
-         (purecopy (format "Select face `%s' for subsequent insertion.
+         (format "Select face `%s' for subsequent insertion.
 If the mark is active and there is no prefix argument,
 apply face `%s' to the region instead.
 This command was defined by `facemenu-add-new-face'."
-                 name name)))
+                 name name))
     (cond ((facemenu-iterate ; check if equivalent face is already in the menu
            (lambda (m) (and (listp m)
                             (symbolp (car m))
@@ -836,15 +827,15 @@ This command was defined by `facemenu-add-new-face'."
          (key
           (setq function (intern (concat "facemenu-set-" name)))
           (fset function
-                `(lambda ()
-                   ,docstring
-                   (interactive)
-                   (facemenu-set-face
-                    (quote ,symbol)
-                    (if (and mark-active (not current-prefix-arg))
-                        (region-beginning))
-                    (if (and mark-active (not current-prefix-arg))
-                        (region-end)))))
+                (lambda ()
+                  (:documentation docstring)
+                  (interactive)
+                  (facemenu-set-face
+                   symbol
+                   (if (and mark-active (not current-prefix-arg))
+                       (region-beginning))
+                   (if (and mark-active (not current-prefix-arg))
+                       (region-end)))))
           (define-key 'facemenu-keymap key (cons name function))
           (define-key menu key (cons name function)))
          ;; Faces with no keyboard equivalent.  Figure out where to put it:
diff --git a/lisp/faces.el b/lisp/faces.el
index 68bfbba..308da93 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -46,7 +46,7 @@ the terminal-initialization file to be loaded."
     ("vt320" . "vt200")
     ("vt400" . "vt200")
     ("vt420" . "vt200")
-    )
+    ("alacritty" . "xterm"))
   "Alist of terminal type aliases.
 Entries are of the form (TYPE . ALIAS), where both elements are strings.
 This means to treat a terminal of type TYPE as if it were of type ALIAS."
@@ -2118,7 +2118,23 @@ the X resource \"reverseVideo\" is present, handle that."
          (x-handle-reverse-video frame parameters)
          (frame-set-background-mode frame t)
          (face-set-after-frame-default frame parameters)
-         (if (null visibility-spec)
+          ;; Mark frame as 'was-invisible' when it was created as
+          ;; invisible or iconified and PARAMETERS contains either a
+          ;; width or height specification.  This should be sufficient
+          ;; to handle Bug#24526 (where a frame is initially iconified
+          ;; to allow manipulating its size in a non-obtrusive way) and
+          ;; avoid that a tiling window manager for GTK3 gets a resize
+          ;; request it cannot handle (Bug#48268).  The 'was-invisible'
+          ;; flag is eventually processed in xterm.c after we receive a
+          ;; MapNotify event; non-X builds ignore it.
+          (frame--set-was-invisible
+           frame
+           (and visibility-spec
+                (memq (cdr visibility-spec) '(nil icon))
+                (or (assq 'width parameters)
+                    (assq 'height parameters))))
+
+          (if (null visibility-spec)
              (make-frame-visible frame)
            (modify-frame-parameters frame (list visibility-spec)))
          (setq success t))
diff --git a/lisp/fileloop.el b/lisp/fileloop.el
index cb9fe8f..8a2755d 100644
--- a/lisp/fileloop.el
+++ b/lisp/fileloop.el
@@ -171,7 +171,8 @@ operating on the next file and nil otherwise."
                (goto-char pos))
            (push-mark original-point t))
 
-         (switch-to-buffer (current-buffer))
+          (let (switch-to-buffer-preserve-window-point)
+           (switch-to-buffer (current-buffer)))
 
          ;; Now operate on the file.
          ;; If value is non-nil, continue to scan the next file.
diff --git a/lisp/files.el b/lisp/files.el
index 8e8fbac..859c193 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -391,6 +391,10 @@ constructed by taking the directory part of the replaced 
file-name,
 concatenated with the buffer file name with all directory separators
 changed to `!' to prevent clashes.  This will not work
 correctly if your filesystem truncates the resulting name.
+If UNIQUIFY is one of the members of `secure-hash-algorithms',
+Emacs constructs the nondirectory part of the auto-save file name
+by applying that `secure-hash' to the buffer file name.  This
+avoids any risk of excessively long file names.
 
 All the transforms in the list are tried, in the order they are listed.
 When one transform applies, its result is final;
@@ -577,7 +581,9 @@ a -*- line.
 
 The command \\[normal-mode], when used interactively,
 always obeys file local variable specifications and the -*- line,
-and ignores this variable."
+and ignores this variable.
+
+Also see the `permanently-enabled-local-variables' variable."
   :risky t
   :type '(choice (const :tag "Query Unsafe" t)
                 (const :tag "Safe Only" :safe)
@@ -1005,7 +1011,7 @@ Any directory whose name matches this regexp will be 
treated like
 a kind of root directory by `locate-dominating-file', which will stop its
 search when it bumps into it.
 The default regexp prevents fruitless and time-consuming attempts to find
-special files in directories in which filenames are interpreted as hostnames,
+special files in directories in which file names are interpreted as host names,
 or mount points potentially requiring authentication as a different user.")
 
 (defun locate-dominating-file (file name)
@@ -2129,27 +2135,60 @@ think it does, because \"free\" is pretty hard to 
define in practice."
 
 (declare-function x-popup-dialog "menu.c" (position contents &optional header))
 
+(defun files--ask-user-about-large-file-help-text (op-type size)
+  "Format the text that explains the options to open large files in Emacs.
+OP-TYPE contains the kind of file operation that will be
+performed.  SIZE is the size of the large file."
+  (format
+   "The file that you want to %s is large (%s), which exceeds the
+ threshold above which Emacs asks for confirmation (%s).
+
+ Large files may be slow to edit or navigate so Emacs asks you
+ before you try to %s such files.
+
+ You can press:
+ 'y' to %s the file.
+ 'n' to abort, and not %s the file.
+ 'l' (the letter ell) to %s the file literally, which means that
+ Emacs will %s the file without doing any format or character code
+ conversion and in Fundamental mode, without loading any potentially
+ expensive features.
+
+ You can customize the option `large-file-warning-threshold' to be the
+ file size, in bytes, from which Emacs will ask for confirmation.  Set
+ it to nil to never request confirmation."
+   op-type
+   size
+   (funcall byte-count-to-string-function large-file-warning-threshold)
+   op-type
+   op-type
+   op-type
+   op-type
+   op-type))
+
 (defun files--ask-user-about-large-file (size op-type filename offer-raw)
+  "Query the user about what to do with large files.
+Files are \"large\" if file SIZE is larger than `large-file-warning-threshold'.
+
+OP-TYPE specifies the file operation being performed on FILENAME.
+
+If OFFER-RAW is true, give user the additional option to open the
+file literally."
   (let ((prompt (format "File %s is large (%s), really %s?"
                        (file-name-nondirectory filename)
                        (funcall byte-count-to-string-function size) op-type)))
     (if (not offer-raw)
         (if (y-or-n-p prompt) nil 'abort)
-      (let* ((use-dialog (and (display-popup-menus-p)
-                              last-input-event
-                             (listp last-nonmenu-event)
-                             use-dialog-box))
-             (choice
-              (if use-dialog
-                  (x-popup-dialog t `(,prompt
-                                      ("Yes" . ?y)
-                                      ("No" . ?n)
-                                      ("Open literally" . ?l)))
-                (read-char-choice
-                 (concat prompt " (y)es or (n)o or (l)iterally ")
-                 '(?y ?Y ?n ?N ?l ?L)))))
-        (cond ((memq choice '(?y ?Y)) nil)
-              ((memq choice '(?l ?L)) 'raw)
+      (let ((choice
+             (car
+              (read-multiple-choice
+               prompt '((?y "yes")
+                        (?n "no")
+                        (?l "literally"))
+               (files--ask-user-about-large-file-help-text
+                op-type (funcall byte-count-to-string-function size))))))
+        (cond ((eq choice ?y) nil)
+              ((eq choice ?l) 'raw)
               (t 'abort))))))
 
 (defun abort-if-file-too-large (size op-type filename &optional offer-raw)
@@ -2249,7 +2288,8 @@ the various files."
        ;; Check to see if the file looks uncommonly large.
        (when (not (or buf nowarn))
           (when (eq (abort-if-file-too-large
-                     (file-attribute-size attributes) "open" filename t)
+                     (file-attribute-size attributes) "open" filename
+                     (not rawfile))
                     'raw)
             (setf rawfile t))
          (warn-maybe-out-of-memory (file-attribute-size attributes)))
@@ -2390,7 +2430,8 @@ Do you want to revisit the file normally now? ")))
           (set-buffer-multibyte t))
       (if rawfile
          (condition-case ()
-             (let ((inhibit-read-only t))
+             (let ((inhibit-read-only t)
+                    (enable-local-variables nil))
                (insert-file-contents-literally filename t))
            (file-error
             (when (and (file-exists-p filename)
@@ -2429,7 +2470,7 @@ Do you want to revisit the file normally now? ")))
           (not (funcall backup-enable-predicate buffer-file-name))
            (setq-local backup-inhibited t))
       (if rawfile
-         (progn
+         (let ((enable-local-variables nil))
            (set-buffer-multibyte nil)
            (setq buffer-file-coding-system 'no-conversion)
            (set-buffer-major-mode buf)
@@ -2537,21 +2578,20 @@ unless NOMODES is non-nil."
     (let* (not-serious
           (msg
            (cond
-            ((not warn) nil)
             ((and error (file-exists-p buffer-file-name))
              (setq buffer-read-only t)
              "File exists, but cannot be read")
             ((and error (file-symlink-p buffer-file-name))
              "Symbolic link that points to nonexistent file")
             ((not buffer-read-only)
-             (if (and warn
-                      ;; No need to warn if buffer is auto-saved
-                      ;; under the name of the visited file.
-                      (not (and buffer-file-name
-                                auto-save-visited-file-name))
-                      (file-newer-than-file-p (or buffer-auto-save-file-name
-                                                  (make-auto-save-file-name))
-                                              buffer-file-name))
+             (if (and
+                   ;; No need to warn if buffer is auto-saved
+                  ;; under the name of the visited file.
+                  (not (and buffer-file-name
+                            auto-save-visited-file-name))
+                  (file-newer-than-file-p (or buffer-auto-save-file-name
+                                              (make-auto-save-file-name))
+                                          buffer-file-name))
                  (format "%s has auto save data; consider M-x 
recover-this-file"
                          (file-name-nondirectory buffer-file-name))
                (setq not-serious t)
@@ -2565,7 +2605,7 @@ unless NOMODES is non-nil."
              (setq buffer-read-only nil)
              (unless (file-directory-p default-directory)
                "Use M-x make-directory RET RET to create the directory and its 
parents")))))
-      (when msg
+      (when (and warn msg)
        (message "%s" msg)
        (or not-serious (sit-for 1 t))))
     (when (and auto-save-default (not noauto))
@@ -2919,7 +2959,7 @@ 
ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|CBR\\|7Z\\|SQUASHFS\\)\\'" .
      ("\\.xmp\\'" . image-mode)
      ("\\.xwd\\'" . image-mode)
      ("\\.yuv\\'" . image-mode)))
-  "Alist of filename patterns vs corresponding major mode functions.
+  "Alist of file name patterns vs corresponding major mode functions.
 Each element looks like (REGEXP . FUNCTION) or (REGEXP FUNCTION NON-NIL).
 \(NON-NIL stands for anything that is not nil; the value does not matter.)
 Visiting a file whose name matches REGEXP specifies FUNCTION as the
@@ -3112,7 +3152,7 @@ To find the right major mode, this function checks for a 
-*- mode tag
 checks for a `mode:' entry in the Local Variables section of the file,
 checks if it uses an interpreter listed in `interpreter-mode-alist',
 matches the buffer beginning against `magic-mode-alist',
-compares the filename against the entries in `auto-mode-alist',
+compares the file name against the entries in `auto-mode-alist',
 then matches the buffer beginning against `magic-fallback-mode-alist'.
 
 If `enable-local-variables' is nil, or if the file name matches
@@ -3166,13 +3206,8 @@ we don't actually set it to the same mode the buffer 
already has."
              (or (set-auto-mode-0 mode keep-mode-if-same)
                  ;; continuing would call minor modes again, toggling them off
                  (throw 'nop nil))))))
-    ;; hack-local-variables checks local-enable-local-variables etc, but
-    ;; we might as well be explicit here for the sake of clarity.
     (and (not done)
-        enable-local-variables
-        local-enable-local-variables
-        try-locals
-        (setq mode (hack-local-variables t))
+        (setq mode (hack-local-variables t (not try-locals)))
         (not (memq mode modes))        ; already tried and failed
         (if (not (functionp mode))
             (message "Ignoring unknown mode `%s'" mode)
@@ -3471,6 +3506,10 @@ function is allowed to change the contents of this alist.
 This hook is called only if there is at least one file-local
 variable to set.")
 
+(defvar permanently-enabled-local-variables '(lexical-binding)
+  "A list of local variables that are always enabled.
+This overrides any `enable-local-variables' setting.")
+
 (defun hack-local-variables-confirm (all-vars unsafe-vars risky-vars dir-name)
   "Get confirmation before setting up local variable values.
 ALL-VARS is the list of all variables to be set up.
@@ -3684,25 +3723,26 @@ DIR-NAME is the name of the associated directory.  
Otherwise it is nil."
 ;; TODO?  Warn once per file rather than once per session?
 (defvar hack-local-variables--warned-lexical nil)
 
-(defun hack-local-variables (&optional handle-mode)
+(defun hack-local-variables (&optional handle-mode inhibit-locals)
   "Parse and put into effect this buffer's local variables spec.
 For buffers visiting files, also puts into effect directory-local
 variables.
-Uses `hack-local-variables-apply' to apply the variables.
 
-If HANDLE-MODE is nil, we apply all the specified local
-variables.  If HANDLE-MODE is neither nil nor t, we do the same,
-except that any settings of `mode' are ignored.
+Uses `hack-local-variables-apply' to apply the variables.
 
-If HANDLE-MODE is t, all we do is check whether a \"mode:\"
-is specified, and return the corresponding mode symbol, or nil.
-In this case, we try to ignore minor-modes, and return only a
-major-mode.
+See `hack-local-variables--find-variables' for the meaning of
+HANDLE-MODE.
 
-If `enable-local-variables' or `local-enable-local-variables' is nil,
-this function does nothing.  If `inhibit-local-variables-regexps'
+If `enable-local-variables' or `local-enable-local-variables' is
+nil, or INHIBIT-LOCALS is non-nil, this function disregards all
+normal local variables.  If `inhibit-local-variables-regexps'
 applies to the file in question, the file is not scanned for
-local variables, but directory-local variables may still be applied."
+local variables, but directory-local variables may still be
+applied.
+
+Variables present in `permanently-enabled-local-variables' will
+still be evaluated, even if local variables are otherwise
+inhibited."
   ;; We don't let inhibit-local-variables-p influence the value of
   ;; enable-local-variables, because then it would affect dir-local
   ;; variables.  We don't want to search eg tar files for file local
@@ -3710,9 +3750,18 @@ local variables, but directory-local variables may still 
be applied."
   ;; to them.  The real meaning of inhibit-local-variables-p is "do
   ;; not scan this file for local variables".
   (let ((enable-local-variables
-        (and local-enable-local-variables enable-local-variables))
-       result)
-    (unless (eq handle-mode t)
+        (and (not inhibit-locals)
+              local-enable-local-variables enable-local-variables)))
+    (if (eq handle-mode t)
+        ;; We're looking just for the major mode setting.
+        (and enable-local-variables
+             (not (inhibit-local-variables-p))
+            ;; If HANDLE-MODE is t, and the prop line specifies a
+            ;; mode, then we're done, and have no need to scan further.
+             (or (hack-local-variables-prop-line t)
+                 ;; Look for the mode elsewhere in the buffer.
+                 (hack-local-variables--find-variables t)))
+      ;; Normal handling of local variables.
       (setq file-local-variables-alist nil)
       (when (and (file-remote-p default-directory)
                  (fboundp 'hack-connection-local-variables)
@@ -3723,133 +3772,138 @@ local variables, but directory-local variables may 
still be applied."
            (connection-local-criteria-for-default-directory))))
       (with-demoted-errors "Directory-local variables error: %s"
        ;; Note this is a no-op if enable-local-variables is nil.
-       (hack-dir-local-variables)))
-    ;; This entire function is basically a no-op if enable-local-variables
-    ;; is nil.  All it does is set file-local-variables-alist to nil.
-    (when enable-local-variables
-      ;; This part used to ignore enable-local-variables when handle-mode
-      ;; was t.  That was inappropriate, eg consider the
-      ;; (artificial) example of:
-      ;; (setq local-enable-local-variables nil)
-      ;; Open a file foo.txt that contains "mode: sh".
-      ;; It correctly opens in text-mode.
-      ;; M-x set-visited-file name foo.c, and it incorrectly stays in 
text-mode.
-      (unless (or (inhibit-local-variables-p)
-                 ;; If HANDLE-MODE is t, and the prop line specifies a
-                 ;; mode, then we're done, and have no need to scan further.
-                 (and (setq result (hack-local-variables-prop-line
-                                     handle-mode))
-                      (eq handle-mode t)))
-       ;; Look for "Local variables:" line in last page.
-       (save-excursion
-         (goto-char (point-max))
-         (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
-                          'move)
-         (when (let ((case-fold-search t))
-                 (search-forward "Local Variables:" nil t))
-           (skip-chars-forward " \t")
-           ;; suffix is what comes after "local variables:" in its line.
-           ;; prefix is what comes before "local variables:" in its line.
-           (let ((suffix
-                  (concat
-                   (regexp-quote (buffer-substring (point)
-                                                   (line-end-position)))
-                   "$"))
-                 (prefix
-                  (concat "^" (regexp-quote
-                               (buffer-substring (line-beginning-position)
-                                                 (match-beginning 0))))))
-
-             (forward-line 1)
-             (let ((startpos (point))
-                   endpos
-                   (thisbuf (current-buffer)))
-               (save-excursion
-                 (unless (let ((case-fold-search t))
-                           (re-search-forward
-                            (concat prefix "[ \t]*End:[ \t]*" suffix)
-                            nil t))
-                   ;; This used to be an error, but really all it means is
-                   ;; that this may simply not be a local-variables section,
-                   ;; so just ignore it.
-                   (message "Local variables list is not properly terminated"))
-                 (beginning-of-line)
-                 (setq endpos (point)))
-
-               (with-temp-buffer
-                 (insert-buffer-substring thisbuf startpos endpos)
-                 (goto-char (point-min))
-                 (subst-char-in-region (point) (point-max) ?\^m ?\n)
-                 (while (not (eobp))
-                   ;; Discard the prefix.
-                   (if (looking-at prefix)
-                       (delete-region (point) (match-end 0))
-                     (error "Local variables entry is missing the prefix"))
-                   (end-of-line)
-                   ;; Discard the suffix.
-                   (if (looking-back suffix (line-beginning-position))
-                       (delete-region (match-beginning 0) (point))
-                     (error "Local variables entry is missing the suffix"))
-                   (forward-line 1))
-                 (goto-char (point-min))
-
-                 (while (not (or (eobp)
-                                  (and (eq handle-mode t) result)))
-                   ;; Find the variable name;
-                   (unless (looking-at hack-local-variable-regexp)
-                      (error "Malformed local variable line: %S"
-                             (buffer-substring-no-properties
-                              (point) (line-end-position))))
-                    (goto-char (match-end 1))
-                   (let* ((str (match-string 1))
-                          (var (intern str))
-                          val val2)
-                     (and (equal (downcase (symbol-name var)) "mode")
-                          (setq var 'mode))
-                     ;; Read the variable value.
-                     (skip-chars-forward "^:")
-                     (forward-char 1)
-                      ;; As a defensive measure, we do not allow
-                      ;; circular data in the file-local data.
-                     (let ((read-circle nil))
-                       (setq val (read (current-buffer))))
-                     (if (eq handle-mode t)
-                         (and (eq var 'mode)
-                              ;; Specifying minor-modes via mode: is
-                              ;; deprecated, but try to reject them anyway.
-                              (not (string-match
-                                    "-minor\\'"
-                                    (setq val2 (downcase (symbol-name val)))))
-                              (setq result (intern (concat val2 "-mode"))))
-                       (cond ((eq var 'coding))
-                             ((eq var 'lexical-binding)
-                              (unless hack-local-variables--warned-lexical
-                                (setq hack-local-variables--warned-lexical t)
-                                (display-warning
-                                  'files
-                                  (format-message
-                                   "%s: `lexical-binding' at end of file 
unreliable"
-                                   (file-name-nondirectory
-                                    ;; We are called from
-                                    ;; 'with-temp-buffer', so we need
-                                    ;; to use 'thisbuf's name in the
-                                    ;; warning message.
-                                    (or (buffer-file-name thisbuf) ""))))))
-                              ((and (eq var 'mode) handle-mode))
-                             (t
-                              (ignore-errors
-                                (push (cons (if (eq var 'eval)
-                                                'eval
-                                              (indirect-variable var))
-                                            val)
-                                       result))))))
-                   (forward-line 1))))))))
-      ;; Now we've read all the local variables.
-      ;; If HANDLE-MODE is t, return whether the mode was specified.
-      (if (eq handle-mode t) result
-       ;; Otherwise, set the variables.
-       (hack-local-variables-filter result nil)
-       (hack-local-variables-apply)))))
+       (hack-dir-local-variables))
+      (let ((result (append (hack-local-variables--find-variables)
+                            (hack-local-variables-prop-line))))
+        (if (and enable-local-variables
+                 (not (inhibit-local-variables-p)))
+            (progn
+             ;; Set the variables.
+             (hack-local-variables-filter result nil)
+             (hack-local-variables-apply))
+          ;; Handle `lexical-binding' and other special local
+          ;; variables.
+          (dolist (variable permanently-enabled-local-variables)
+            (when-let ((elem (assq variable result)))
+              (push elem file-local-variables-alist)))
+          (hack-local-variables-apply))))))
+
+(defun hack-local-variables--find-variables (&optional handle-mode)
+  "Return all local variables in the ucrrent buffer.
+If HANDLE-MODE is nil, we gather all the specified local
+variables.  If HANDLE-MODE is neither nil nor t, we do the same,
+except that any settings of `mode' are ignored.
+
+If HANDLE-MODE is t, all we do is check whether a \"mode:\"
+is specified, and return the corresponding mode symbol, or nil.
+In this case, we try to ignore minor-modes, and return only a
+major-mode."
+  (let ((result nil))
+    ;; Look for "Local variables:" line in last page.
+    (save-excursion
+      (goto-char (point-max))
+      (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
+                      'move)
+      (when (let ((case-fold-search t))
+             (search-forward "Local Variables:" nil t))
+        (skip-chars-forward " \t")
+        ;; suffix is what comes after "local variables:" in its line.
+        ;; prefix is what comes before "local variables:" in its line.
+        (let ((suffix
+              (concat
+               (regexp-quote (buffer-substring (point)
+                                               (line-end-position)))
+               "$"))
+             (prefix
+              (concat "^" (regexp-quote
+                           (buffer-substring (line-beginning-position)
+                                             (match-beginning 0))))))
+
+         (forward-line 1)
+         (let ((startpos (point))
+               endpos
+               (thisbuf (current-buffer)))
+           (save-excursion
+             (unless (let ((case-fold-search t))
+                       (re-search-forward
+                        (concat prefix "[ \t]*End:[ \t]*" suffix)
+                        nil t))
+               ;; This used to be an error, but really all it means is
+               ;; that this may simply not be a local-variables section,
+               ;; so just ignore it.
+               (message "Local variables list is not properly terminated"))
+             (beginning-of-line)
+             (setq endpos (point)))
+
+           (with-temp-buffer
+             (insert-buffer-substring thisbuf startpos endpos)
+             (goto-char (point-min))
+             (subst-char-in-region (point) (point-max) ?\^m ?\n)
+             (while (not (eobp))
+               ;; Discard the prefix.
+               (if (looking-at prefix)
+                   (delete-region (point) (match-end 0))
+                 (error "Local variables entry is missing the prefix"))
+               (end-of-line)
+               ;; Discard the suffix.
+               (if (looking-back suffix (line-beginning-position))
+                   (delete-region (match-beginning 0) (point))
+                 (error "Local variables entry is missing the suffix"))
+               (forward-line 1))
+             (goto-char (point-min))
+
+             (while (not (or (eobp)
+                              (and (eq handle-mode t) result)))
+               ;; Find the variable name;
+               (unless (looking-at hack-local-variable-regexp)
+                  (error "Malformed local variable line: %S"
+                         (buffer-substring-no-properties
+                          (point) (line-end-position))))
+                (goto-char (match-end 1))
+               (let* ((str (match-string 1))
+                      (var (intern str))
+                      val val2)
+                 (and (equal (downcase (symbol-name var)) "mode")
+                      (setq var 'mode))
+                 ;; Read the variable value.
+                 (skip-chars-forward "^:")
+                 (forward-char 1)
+                  ;; As a defensive measure, we do not allow
+                  ;; circular data in the file-local data.
+                 (let ((read-circle nil))
+                   (setq val (read (current-buffer))))
+                 (if (eq handle-mode t)
+                     (and (eq var 'mode)
+                          ;; Specifying minor-modes via mode: is
+                          ;; deprecated, but try to reject them anyway.
+                          (not (string-match
+                                "-minor\\'"
+                                (setq val2 (downcase (symbol-name val)))))
+                          (setq result (intern (concat val2 "-mode"))))
+                   (cond ((eq var 'coding))
+                         ((eq var 'lexical-binding)
+                          (unless hack-local-variables--warned-lexical
+                            (setq hack-local-variables--warned-lexical t)
+                            (display-warning
+                              'files
+                              (format-message
+                               "%s: `lexical-binding' at end of file 
unreliable"
+                               (file-name-nondirectory
+                                ;; We are called from
+                                ;; 'with-temp-buffer', so we need
+                                ;; to use 'thisbuf's name in the
+                                ;; warning message.
+                                (or (buffer-file-name thisbuf) ""))))))
+                          ((and (eq var 'mode) handle-mode))
+                         (t
+                          (ignore-errors
+                            (push (cons (if (eq var 'eval)
+                                            'eval
+                                          (indirect-variable var))
+                                        val)
+                                   result))))))
+               (forward-line 1)))))))
+    result))
 
 (defun hack-local-variables-apply ()
   "Apply the elements of `file-local-variables-alist'.
@@ -3987,7 +4041,7 @@ already the major mode."
     ('eval
      (pcase val
        (`(add-hook ',hook . ,_) (hack-one-local-variable--obsolete hook)))
-     (save-excursion (eval val)))
+     (save-excursion (eval val t)))
     (_
      (hack-one-local-variable--obsolete var)
      ;; Make sure the string has no text properties.
@@ -4307,6 +4361,9 @@ Return the new class name, which is a symbol named DIR."
                      (let ((read-circle nil))
                        (read (current-buffer)))
                    (end-of-file nil))))
+            (unless (listp newvars)
+              (message "Invalid data in %s: %s" file newvars)
+              (setq newvars nil))
             (setq variables
                   ;; Try and avoid loading `map' since that also loads cl-lib
                   ;; which then might hamper bytecomp warnings (bug#30635).
@@ -4837,6 +4894,27 @@ extension, the value is \"\"."
         (if period
             "")))))
 
+(defun file-name-with-extension (filename extension)
+  "Set the EXTENSION of a FILENAME.
+The extension (in a file name) is the part that begins with the last \".\".
+
+Trims a leading dot from the EXTENSION so that either \"foo\" or
+\".foo\" can be given.
+
+Errors if the FILENAME or EXTENSION are empty, or if the given
+FILENAME has the format of a directory.
+
+See also `file-name-sans-extension'."
+  (let ((extn (string-trim-left extension "[.]")))
+    (cond ((string-empty-p filename)
+           (error "Empty filename: %s" filename))
+          ((string-empty-p extn)
+           (error "Malformed extension: %s" extension))
+          ((directory-name-p filename)
+           (error "Filename is a directory: %s" filename))
+          (t
+           (concat (file-name-sans-extension filename) "." extn)))))
+
 (defun file-name-base (&optional filename)
   "Return the base name of the FILENAME: no directory, no extension."
   (declare (advertised-calling-convention (filename) "27.1"))
@@ -4863,7 +4941,7 @@ See also `backup-directory-alist'."
                 (function :tag "Function")))
 
 (defcustom backup-directory-alist nil
-  "Alist of filename patterns and backup directory names.
+  "Alist of file name patterns and backup directory names.
 Each element looks like (REGEXP . DIRECTORY).  Backups of files with
 names matching REGEXP will be made in DIRECTORY.  DIRECTORY may be
 relative or absolute.  If it is absolute, so that all matching files
@@ -4876,7 +4954,7 @@ For the common case of all backups going into one 
directory, the alist
 should contain a single element pairing \".\" with the appropriate
 directory name.
 
-If this variable is nil, or it fails to match a filename, the backup
+If this variable is nil, or it fails to match a file name, the backup
 is made in the original file's directory.
 
 On MS-DOS filesystems without long names this variable is always
@@ -6193,8 +6271,11 @@ Non-file buffers need a custom function."
                         (dolist (regexp revert-without-query)
                           (when (string-match regexp file-name)
                             (throw 'found t)))))
-                 (yes-or-no-p (format "Revert buffer from file %s? "
-                                      file-name)))
+                 (yes-or-no-p
+                  (format (if (buffer-modified-p)
+                              "Discard edits and reread from %s? "
+                            "Revert buffer from file %s? ")
+                          file-name)))
              (run-hooks 'before-revert-hook)
              ;; If file was backed up but has changed since,
              ;; we should make another backup.
@@ -6599,14 +6680,20 @@ See also `auto-save-file-name-p'."
                        uniq (car (cddr (car list)))))
              (setq list (cdr list)))
            (if result
-               (if uniq
-                   (setq filename (concat
-                                   (file-name-directory result)
-                                   (subst-char-in-string
-                                    ?/ ?!
-                                    (replace-regexp-in-string "!" "!!"
-                                                              filename))))
-                 (setq filename result)))
+                (setq filename
+                      (cond
+                       ((memq uniq (secure-hash-algorithms))
+                        (concat
+                         (file-name-directory result)
+                         (secure-hash uniq filename)))
+                       (uniq
+                        (concat
+                        (file-name-directory result)
+                        (subst-char-in-string
+                         ?/ ?!
+                         (replace-regexp-in-string
+                           "!" "!!" filename))))
+                      (t result))))
            (setq result
                  (if (and (eq system-type 'ms-dos)
                           (not (msdos-long-file-names)))
@@ -6693,7 +6780,7 @@ See also `make-auto-save-file-name'."
 
 (defun wildcard-to-regexp (wildcard)
   "Given a shell file name pattern WILDCARD, return an equivalent regexp.
-The generated regexp will match a filename only if the filename
+The generated regexp will match a file name only if the file name
 matches that wildcard according to shell rules.  Only wildcards known
 by `sh' are supported."
   (let* ((i (string-match "[[.*+\\^$?]" wildcard))
@@ -7413,7 +7500,7 @@ If the current frame has no client, kill Emacs itself 
using
 
 With prefix ARG, silently save all file-visiting buffers, then kill.
 
-If emacsclient was started with a list of filenames to edit, then
+If emacsclient was started with a list of file names to edit, then
 only these files will be asked to be saved."
   (interactive "P")
   (if (frame-parameter nil 'client)
@@ -7434,12 +7521,11 @@ only these files will be asked to be saved."
 ;; operations, which return a file name.  See Bug#29579.
 
 (defun file-name-non-special (operation &rest arguments)
-  (let (;; In general, we don't want any file name handler.  For some
-        ;; few cases, operations with two file name arguments which
-        ;; might be bound to different file name handlers, we still
-        ;; need this.
-        (saved-file-name-handler-alist file-name-handler-alist)
-        file-name-handler-alist
+  (let ((inhibit-file-name-handlers
+         (cons 'file-name-non-special
+               (and (eq inhibit-file-name-operation operation)
+                    inhibit-file-name-handlers)))
+        (inhibit-file-name-operation operation)
         ;; Some operations respect file name handlers in
         ;; `default-directory'.  Because core function like
         ;; `call-process' don't care about file name handlers in
@@ -7521,69 +7607,73 @@ only these files will be asked to be saved."
          (when (car pair)
            (setcar pair (file-name-unquote (car pair) t))))
        (setq file-arg-indices (cdr file-arg-indices))))
-    (pcase method
-      ('identity (car arguments))
-      ('add (file-name-quote (apply operation arguments) t))
-      ('buffer-file-name
-       (let ((buffer-file-name (file-name-unquote buffer-file-name t)))
-         (apply operation arguments)))
-      ('insert-file-contents
-       (let ((visit (nth 1 arguments)))
-         (unwind-protect
-             (apply operation arguments)
-           (when (and visit buffer-file-name)
-             (setq buffer-file-name (file-name-quote buffer-file-name t))))))
-      ('unquote-then-quote
-       ;; We can't use `cl-letf' with `(buffer-local-value)' here
-       ;; because it wouldn't work during bootstrapping.
-       (let ((buffer (current-buffer)))
-         ;; `unquote-then-quote' is used only for the
-         ;; `verify-visited-file-modtime' action, which takes a buffer
-         ;; as only optional argument.
-         (with-current-buffer (or (car arguments) buffer)
-           (let ((buffer-file-name (file-name-unquote buffer-file-name t)))
-             ;; Make sure to hide the temporary buffer change from the
-             ;; underlying operation.
-             (with-current-buffer buffer
-               (apply operation arguments))))))
-      ('local-copy
-       (let* ((file-name-handler-alist saved-file-name-handler-alist)
-              (source (car arguments))
-              (target (car (cdr arguments)))
-              (prefix (expand-file-name
-                       "file-name-non-special" temporary-file-directory))
-              tmpfile)
-         (cond
-          ;; If source is remote, we must create a local copy.
-          ((file-remote-p source)
-           (setq tmpfile (make-temp-name prefix))
-           (apply operation source tmpfile (cddr arguments))
-           (setq source tmpfile))
-          ;; If source is quoted, and the unquoted source looks
-          ;; remote, we must create a local copy.
-          ((file-name-quoted-p source t)
-           (setq source (file-name-unquote source t))
-           (when (file-remote-p source)
+    ;; In general, we don't want any file name handler, see Bug#47625,
+    ;; Bug#48349.  For some few cases, operations with two file name
+    ;; arguments which might be bound to different file name handlers,
+    ;; we still need this.
+    (let ((tramp-mode (and tramp-mode (eq method 'local-copy))))
+      (pcase method
+        ('identity (car arguments))
+        ('add (file-name-quote (apply operation arguments) t))
+        ('buffer-file-name
+         (let ((buffer-file-name (file-name-unquote buffer-file-name t)))
+           (apply operation arguments)))
+        ('insert-file-contents
+         (let ((visit (nth 1 arguments)))
+           (unwind-protect
+               (apply operation arguments)
+             (when (and visit buffer-file-name)
+               (setq buffer-file-name (file-name-quote buffer-file-name t))))))
+        ('unquote-then-quote
+         ;; We can't use `cl-letf' with `(buffer-local-value)' here
+         ;; because it wouldn't work during bootstrapping.
+         (let ((buffer (current-buffer)))
+           ;; `unquote-then-quote' is used only for the
+           ;; `verify-visited-file-modtime' action, which takes a
+           ;; buffer as only optional argument.
+           (with-current-buffer (or (car arguments) buffer)
+             (let ((buffer-file-name (file-name-unquote buffer-file-name t)))
+               ;; Make sure to hide the temporary buffer change from
+               ;; the underlying operation.
+               (with-current-buffer buffer
+                 (apply operation arguments))))))
+        ('local-copy
+         (let ((source (car arguments))
+               (target (car (cdr arguments)))
+               (prefix (expand-file-name
+                        "file-name-non-special" temporary-file-directory))
+               tmpfile)
+           (cond
+            ;; If source is remote, we must create a local copy.
+            ((file-remote-p source)
              (setq tmpfile (make-temp-name prefix))
-             (let (file-name-handler-alist)
-               (apply operation source tmpfile (cddr arguments)))
-             (setq source tmpfile))))
-         ;; If target is quoted, and the unquoted target looks remote,
-         ;; we must disable the file name handler.
-         (when (file-name-quoted-p target t)
-           (setq target (file-name-unquote target t))
-           (when (file-remote-p target)
-             (setq file-name-handler-alist nil)))
-         ;; Do it.
-         (setcar arguments source)
-         (setcar (cdr arguments) target)
-         (apply operation arguments)
-         ;; Cleanup.
-         (when (and tmpfile (file-exists-p tmpfile))
-           (if (file-directory-p tmpfile)
-               (delete-directory tmpfile 'recursive) (delete-file tmpfile)))))
-      (_
-       (apply operation arguments)))))
+             (apply operation source tmpfile (cddr arguments))
+             (setq source tmpfile))
+            ;; If source is quoted, and the unquoted source looks
+            ;; remote, we must create a local copy.
+            ((file-name-quoted-p source t)
+             (setq source (file-name-unquote source t))
+             (when (file-remote-p source)
+               (setq tmpfile (make-temp-name prefix))
+               (let (file-name-handler-alist)
+                 (apply operation source tmpfile (cddr arguments)))
+               (setq source tmpfile))))
+           ;; If target is quoted, and the unquoted target looks
+           ;; remote, we must disable the file name handler.
+           (when (file-name-quoted-p target t)
+             (setq target (file-name-unquote target t))
+             (when (file-remote-p target)
+               (setq file-name-handler-alist nil)))
+           ;; Do it.
+           (setcar arguments source)
+           (setcar (cdr arguments) target)
+           (apply operation arguments)
+           ;; Cleanup.
+           (when (and tmpfile (file-exists-p tmpfile))
+             (if (file-directory-p tmpfile)
+                 (delete-directory tmpfile 'recursive) (delete-file 
tmpfile)))))
+        (_
+         (apply operation arguments))))))
 
 (defsubst file-name-quoted-p (name &optional top)
   "Whether NAME is quoted with prefix \"/:\".
@@ -7884,6 +7974,7 @@ Otherwise, trash FILENAME using the freedesktop.org 
conventions,
 
               ;; Make a .trashinfo file.  Use O_EXCL, as per trash-spec 1.0.
               (let* ((files-base (file-name-nondirectory fn))
+                      (is-directory (file-directory-p fn))
                       (overwrite nil)
                       info-fn)
                  ;; We're checking further down whether the info file
@@ -7895,7 +7986,8 @@ Otherwise, trash FILENAME using the freedesktop.org 
conventions,
                          files-base (file-name-nondirectory
                                      (make-temp-file
                                       (expand-file-name
-                                       files-base trash-files-dir)))))
+                                       files-base trash-files-dir)
+                                      is-directory))))
                 (setq info-fn (expand-file-name
                                (concat files-base ".trashinfo")
                                trash-info-dir))
diff --git a/lisp/find-dired.el b/lisp/find-dired.el
index adc5672..87a7407 100644
--- a/lisp/find-dired.el
+++ b/lisp/find-dired.el
@@ -225,8 +225,8 @@ it finishes, type \\[kill-find]."
       (use-local-map map))
     (setq-local dired-sort-inhibit t)
     (setq-local revert-buffer-function
-                `(lambda (ignore-auto noconfirm)
-                   (find-dired ,dir ,find-args)))
+                (lambda (_ignore-auto _noconfirm)
+                  (find-dired dir find-args)))
     ;; Set subdir-alist so that Tree Dired will work:
     (if (fboundp 'dired-simple-subdir-alist)
        ;; will work even with nested dired format (dired-nstd.el,v 1.15
diff --git a/lisp/find-file.el b/lisp/find-file.el
index 6c3c0f1..4fd4f4e 100644
--- a/lisp/find-file.el
+++ b/lisp/find-file.el
@@ -305,6 +305,10 @@ Being on a `#include' line pulls in that file.
 If optional IN-OTHER-WINDOW is non-nil, find the file in the other window.
 If optional IGNORE-INCLUDE is non-nil, ignore being on `#include' lines.
 
+If optional EVENT is non-nil (default `last-nonmenu-event', move
+point to the end position of that event before calling the
+various ff-* hooks.
+
 Variables of interest include:
 
  - `ff-case-fold-search'
@@ -351,10 +355,16 @@ Variables of interest include:
  - `ff-file-created-hook'
    List of functions to be called if the other file has been created."
   (interactive (list current-prefix-arg nil last-nonmenu-event))
-  (save-excursion
+  ;; We want to preserve point in the current buffer. But the point of
+  ;; ff-find-the-other-file is to make the the other file buffer
+  ;; current, so we can't use save-excursion here (see bug 48535).
+  (let ((start-buffer (current-buffer))
+        (start-point (point)))
     (posn-set-point (event-end event))
     (let ((ff-ignore-include ignore-include))
-      (ff-find-the-other-file in-other-window))))
+      (ff-find-the-other-file in-other-window))
+    (with-current-buffer start-buffer
+      (goto-char start-point))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Support functions
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 82915d8..4dc42d9 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -1604,18 +1604,15 @@ START should be at the beginning of a line."
   "If non-nil, Font Lock mode uses this instead of `comment-start-skip'.")
 
 (defvar font-lock-comment-end-skip nil
-  "If non-nil, Font Lock mode uses this instead of `comment-end'.")
+  "If non-nil, Font Lock mode uses this instead of `comment-end-skip'.")
 
 (defun font-lock-fontify-syntactically-region (start end &optional loudly)
   "Put proper face on each string and comment between START and END.
 START should be at the beginning of a line."
   (syntax-propertize end)  ; Apply any needed syntax-table properties.
   (with-syntax-table (or syntax-ppss-table (syntax-table))
-    (let ((comment-end-regexp
-          (or font-lock-comment-end-skip
-              (regexp-quote
-               (replace-regexp-in-string "^ *" "" comment-end))))
-          ;; Find the `start' state.
+    (when (and comment-start (not comment-end-skip)) (comment-normalize-vars))
+    (let (;; Find the `start' state.
           (state (if (or syntax-ppss-table
                          (not font-lock--syntax-table-affects-ppss))
                      (syntax-ppss start)
@@ -1648,7 +1645,9 @@ START should be at the beginning of a line."
                                      comment-start-skip))
                      (put-text-property beg (match-end 0) 'face
                                         font-lock-comment-delimiter-face)))
-               (if (looking-back comment-end-regexp (point-at-bol) t)
+               (if (looking-back (or font-lock-comment-end-skip
+                                     comment-end-skip)
+                                 (point-at-bol) t)
                    (put-text-property (match-beginning 0) (point) 'face
                                       font-lock-comment-delimiter-face))))
            (< (point) end))
diff --git a/lisp/format.el b/lisp/format.el
index 3e2d92f..1e87d25 100644
--- a/lisp/format.el
+++ b/lisp/format.el
@@ -181,7 +181,7 @@ it should be a Lisp function.  BUFFER is currently ignored."
        ;; We should perhaps go via a temporary buffer and copy it
        ;; back, in case of errors.
        (if (and (zerop (save-window-excursion
-                         (shell-command-on-region from to method t t
+                         (shell-command-on-region from to method t 'no-mark
                                                   error-buff)))
                 ;; gzip gives zero exit status with bad args, for instance.
                 (zerop (with-current-buffer error-buff
diff --git a/lisp/fringe.el b/lisp/fringe.el
index e2d7968..d73aae0 100644
--- a/lisp/fringe.el
+++ b/lisp/fringe.el
@@ -181,7 +181,11 @@ When setting this variable in a Lisp program, call
 `set-fringe-mode' afterward to make it take real effect.
 
 To modify the appearance of the fringe in a specific frame, use
-the interactive function `set-fringe-style'."
+the interactive function `set-fringe-style'.
+
+Note that, despite the name, this is not a variable that controls
+a (major or minor) Emacs mode, but controls the appearance of the
+fringes."
   :type `(choice
           ,@ (mapcar (lambda (style)
                       (let ((name
@@ -248,7 +252,10 @@ Fringe widths set by `set-window-fringes' override the 
default
 fringe widths set by this command.  This command applies to all
 frames that exist and frames to be created in the future.  If you
 want to set the default appearance of fringes on the selected
-frame only, see the command `set-fringe-style'."
+frame only, see the command `set-fringe-style'.
+
+Note that, despite the name, this is not a (major or minor) Emacs
+mode, but a command that controls the appearance of the fringes."
   (interactive (list (fringe-query-style 'all-frames)))
   (set-fringe-mode mode))
 
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index d989a4d..f2ec946 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -170,12 +170,17 @@ If `gnus-visible-headers' is non-nil, this variable will 
be ignored."
   "All headers that do not match this regexp will be hidden.
 This variable can also be a list of regexp of headers to remain visible.
 If this variable is non-nil, `gnus-ignored-headers' will be ignored."
-  :type '(choice
-         (repeat :value-to-internal (lambda (widget value)
-                                      (custom-split-regexp-maybe value))
-                 :match (lambda (widget value)
-                          (or (stringp value)
-                              (widget-editable-list-match widget value)))
+  :type `(choice
+         (repeat :value-to-internal
+                 ,(lambda (_widget value)
+                    ;; FIXME: Are we sure this can't be used without
+                    ;; loading cus-edit?
+                    (declare-function custom-split-regexp-maybe
+                                      "cus-edit" (regexp))
+                    (custom-split-regexp-maybe value))
+                 :match ,(lambda (widget value)
+                           (or (stringp value)
+                               (widget-editable-list-match widget value)))
                  regexp)
          (const :tag "Use gnus-ignored-headers" nil)
          regexp)
@@ -402,14 +407,14 @@ the entire emphasized word.  The third is a number that 
says what
 regexp grouping should be displayed and highlighted.  The fourth
 is the face used for highlighting."
   :type
-  '(repeat
+  `(repeat
     (menu-choice
      :format "%[Customizing Style%]\n%v"
      :indent 2
      (group :tag "Default"
            :value ("" 0 0 default)
            :value-create
-           (lambda (widget)
+           ,(lambda (widget)
              (let ((value (widget-get
                            (cadr (widget-get (widget-get widget :parent)
                                              :args))
@@ -2221,6 +2226,10 @@ unfolded."
   "Show any images that are in the HTML-rendered article buffer.
 This only works if the article in question is HTML."
   (interactive nil gnus-article-mode gnus-summary-mode)
+  ;; Reselect for image display.
+  (let ((gnus-blocked-images nil)
+        (gnus-inhibit-images nil))
+    (gnus-summary-select-article))
   (gnus-with-article-buffer
     (save-restriction
       (widen)
@@ -3734,7 +3743,7 @@ is to run."
     (setq n 1))
   (gnus-stop-date-timer)
   (setq article-lapsed-timer
-       (run-at-time 1 n 'article-update-date-lapsed)))
+       (run-at-time 1 n #'article-update-date-lapsed)))
 
 (defun gnus-stop-date-timer ()
   "Stop the Date timer."
@@ -4401,7 +4410,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
   "\M-g" gnus-article-read-summary-keys)
 
 (substitute-key-definition
- 'undefined 'gnus-article-read-summary-keys gnus-article-mode-map)
+ #'undefined #'gnus-article-read-summary-keys gnus-article-mode-map)
 
 (defvar gnus-article-send-map)
 (gnus-define-keys (gnus-article-send-map "S" gnus-article-mode-map)
@@ -4479,12 +4488,12 @@ commands:
   (make-local-variable 'gnus-article-image-alist)
   (make-local-variable 'gnus-article-charset)
   (make-local-variable 'gnus-article-ignored-charsets)
-  (setq-local bookmark-make-record-function 'gnus-summary-bookmark-make-record)
+  (setq-local bookmark-make-record-function 
#'gnus-summary-bookmark-make-record)
   ;; Prevent Emacs from displaying non-break space with
   ;; `nobreak-space' face.
   (setq-local nobreak-char-display nil)
   ;; Enable `gnus-article-remove-images' to delete images shr.el renders.
-  (setq-local shr-put-image-function 'gnus-shr-put-image)
+  (setq-local shr-put-image-function #'gnus-shr-put-image)
   (unless gnus-article-show-cursor
     (setq cursor-in-non-selected-windows nil))
   (gnus-set-default-directory)
@@ -4719,16 +4728,17 @@ If ALL-HEADERS is non-nil, no headers are hidden."
 (define-derived-mode gnus-sticky-article-mode gnus-article-mode "StickyArticle"
   "Mode for sticky articles."
   ;; Release bindings that won't work.
-  (substitute-key-definition 'gnus-article-read-summary-keys 'undefined
+  (substitute-key-definition #'gnus-article-read-summary-keys #'undefined
                             gnus-sticky-article-mode-map)
-  (substitute-key-definition 'gnus-article-refer-article 'undefined
+  (substitute-key-definition #'gnus-article-refer-article #'undefined
                             gnus-sticky-article-mode-map)
   (dolist (k '("e" "h" "s" "F" "R"))
     (define-key gnus-sticky-article-mode-map k nil))
-  (define-key gnus-sticky-article-mode-map "k" 
'gnus-kill-sticky-article-buffer)
-  (define-key gnus-sticky-article-mode-map "q" 'bury-buffer)
-  (define-key gnus-sticky-article-mode-map "\C-hc" 'describe-key-briefly)
-  (define-key gnus-sticky-article-mode-map "\C-hk" 'describe-key))
+  (define-key gnus-sticky-article-mode-map "k"
+    #'gnus-kill-sticky-article-buffer)
+  (define-key gnus-sticky-article-mode-map "q"     #'bury-buffer)
+  (define-key gnus-sticky-article-mode-map "\C-hc" #'describe-key-briefly)
+  (define-key gnus-sticky-article-mode-map "\C-hk" #'describe-key))
 
 (defun gnus-sticky-article (arg)
   "Make the current article sticky.
@@ -4859,9 +4869,9 @@ General format specifiers can also be used.  See Info node
 
 (defvar gnus-mime-button-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "\r" 'gnus-article-push-button)
-    (define-key map [mouse-2] 'gnus-article-push-button)
-    (define-key map [down-mouse-3] 'gnus-mime-button-menu)
+    (define-key map "\r"           #'gnus-article-push-button)
+    (define-key map [mouse-2]      #'gnus-article-push-button)
+    (define-key map [down-mouse-3] #'gnus-mime-button-menu)
     (dolist (c gnus-mime-button-commands)
       (define-key map (cadr c) (car c)))
     map))
@@ -6134,7 +6144,7 @@ If nil, don't show those extra buttons."
   (let* ((preferred (or preferred (mm-preferred-alternative handles)))
         (ihandles handles)
         (point (point))
-        handle (inhibit-read-only t) begend not-pref) ;; from
+        (inhibit-read-only t) begend not-pref) ;; from
     (save-window-excursion
       (save-restriction
        (when ibegend
@@ -6148,8 +6158,8 @@ If nil, don't show those extra buttons."
          (mm-remove-parts handles))
        (setq begend (list (point-marker)))
        ;; Do the toggle.
-       (unless (setq not-pref (cadr (member preferred ihandles)))
-         (setq not-pref (car ihandles)))
+       (setq not-pref (or (cadr (member preferred ihandles))
+                          (car ihandles)))
        (when (or ibegend
                  (not preferred)
                  (not (gnus-unbuttonized-mime-type-p
@@ -6160,22 +6170,22 @@ If nil, don't show those extra buttons."
           (progn
             (insert (format "%d.  " id))
             (point))
-          `(gnus-callback
-            (lambda (handles)
-              (unless ,(not ibegend)
-                (setq gnus-article-mime-handle-alist
-                      ',gnus-article-mime-handle-alist))
-              (gnus-mime-display-alternative
-               ',ihandles ',not-pref ',begend ,id))
-            keymap ,gnus-mime-button-map
-            mouse-face ,gnus-article-mouse-face
-            face ,gnus-article-button-face
-            follow-link t
-            gnus-part ,id
-            article-type multipart
-            rear-nonsticky t))
+          (let ((gamha gnus-article-mime-handle-alist))
+            `(gnus-callback
+              ,(lambda (_handles)
+                 (unless (not ibegend)
+                   (setq gnus-article-mime-handle-alist gamha))
+                 (gnus-mime-display-alternative
+                  ihandles not-pref begend id))
+              keymap ,gnus-mime-button-map
+              mouse-face ,gnus-article-mouse-face
+              face ,gnus-article-button-face
+              follow-link t
+              gnus-part ,id
+              article-type multipart
+              rear-nonsticky t)))
          ;; Do the handles
-         (while (setq handle (pop handles))
+         (dolist (handle handles)
            (add-text-properties
             ;; (setq from
             (point) ;; )
@@ -6184,22 +6194,22 @@ If nil, don't show those extra buttons."
                               (if (equal handle preferred) ?* ? )
                               (mm-handle-media-type handle)))
               (point))
-            `(gnus-callback
-              (lambda (handles)
-                (unless ,(not ibegend)
-                  (setq gnus-article-mime-handle-alist
-                        ',gnus-article-mime-handle-alist))
-                (gnus-mime-display-alternative
-                 ',ihandles ',handle ',begend ,id))
-              keymap ,gnus-mime-button-map
-              mouse-face ,gnus-article-mouse-face
-              face ,gnus-article-button-face
-              follow-link t
-              gnus-part ,id
-              button t
-              category t
-              gnus-data ,handle
-              rear-nonsticky t))
+            (let ((gamha gnus-article-mime-handle-alist))
+              `(gnus-callback
+                ,(lambda (_handles)
+                   (unless (not ibegend)
+                     (setq gnus-article-mime-handle-alist gamha))
+                   (gnus-mime-display-alternative
+                    ihandles handle begend id))
+                keymap ,gnus-mime-button-map
+                mouse-face ,gnus-article-mouse-face
+                face ,gnus-article-button-face
+                follow-link t
+                gnus-part ,id
+                button t
+                category t
+                gnus-data ,handle
+                rear-nonsticky t)))
            (insert "  "))
          (insert "\n\n"))
        (when preferred
@@ -6304,7 +6314,8 @@ is the string to use when it is inactive.")
     (setq gnus-article-image-alist (delq entry gnus-article-image-alist))
     (gnus-delete-wash-type category)))
 
-(defalias 'gnus-article-hide-headers-if-wanted 
'gnus-article-maybe-hide-headers)
+(defalias 'gnus-article-hide-headers-if-wanted
+  #'gnus-article-maybe-hide-headers)
 
 (defun gnus-article-maybe-hide-headers ()
   "Hide unwanted headers if `gnus-have-all-headers' is nil.
@@ -6870,7 +6881,7 @@ then we display only bindings that start with that 
prefix."
        parent agent draft)
     (define-key keymap "S" map)
     (define-key map [t] nil)
-    (define-key summap [t] 'undefined)
+    (define-key summap [t] #'undefined)
     (with-current-buffer gnus-article-current-summary
       (dolist (key sumkeys)
        (define-key summap key (key-binding key (current-local-map))))
@@ -6906,10 +6917,11 @@ then we display only bindings that start with that 
prefix."
       (setq-local gnus-agent-summary-mode agent)
       (setq-local gnus-draft-mode draft)
       (describe-bindings prefix))
-    (let ((item `((lambda (prefix)
-                   (with-current-buffer ,(current-buffer)
-                     (gnus-article-describe-bindings prefix)))
-                 ,prefix)))
+    (let* ((cb (current-buffer))
+          (item `(,(lambda (prefix)
+                     (with-current-buffer cb
+                       (gnus-article-describe-bindings prefix)))
+                  ,prefix)))
       ;; Loading `help-mode' here is necessary if `describe-bindings'
       ;; is replaced with something, e.g. `helm-descbinds'.
       (require 'help-mode)
@@ -8390,14 +8402,14 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defvar gnus-prev-page-map
   (let ((map (make-sparse-keymap)))
-    (define-key map [mouse-2] 'gnus-button-prev-page)
-    (define-key map "\r" 'gnus-button-prev-page)
+    (define-key map [mouse-2] #'gnus-button-prev-page)
+    (define-key map "\r"      #'gnus-button-prev-page)
     map))
 
 (defvar gnus-next-page-map
   (let ((map (make-sparse-keymap)))
-    (define-key map [mouse-2] 'gnus-button-next-page)
-    (define-key map "\r" 'gnus-button-next-page)
+    (define-key map [mouse-2] #'gnus-button-next-page)
+    (define-key map "\r"      #'gnus-button-next-page)
     map))
 
 (defun gnus-insert-prev-page-button ()
@@ -8701,9 +8713,9 @@ For example:
 
 (defvar gnus-mime-security-button-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "\r" 'gnus-article-push-button)
-    (define-key map [mouse-2] 'gnus-article-push-button)
-    (define-key map [down-mouse-3] 'gnus-mime-security-button-menu)
+    (define-key map "\r"           #'gnus-article-push-button)
+    (define-key map [mouse-2]      #'gnus-article-push-button)
+    (define-key map [down-mouse-3] #'gnus-mime-security-button-menu)
     (dolist (c gnus-mime-security-button-commands)
       (define-key map (cadr c) (car c)))
     map))
diff --git a/lisp/gnus/gnus-fun.el b/lisp/gnus/gnus-fun.el
index c2e72ab..8bca4ff 100644
--- a/lisp/gnus/gnus-fun.el
+++ b/lisp/gnus/gnus-fun.el
@@ -206,12 +206,11 @@ different input formats."
 (defun gnus-convert-face-to-png (face)
   "Convert FACE (which is base64-encoded) to a PNG.
 The PNG is returned as a string."
-  (let ((face (gnus-base64-repad face nil nil t)))
-    (mm-with-unibyte-buffer
-      (insert face)
-      (ignore-errors
-       (base64-decode-region (point-min) (point-max)))
-      (buffer-string))))
+  (mm-with-unibyte-buffer
+    (insert face)
+    (ignore-errors
+      (base64-decode-region (point-min) (point-max)))
+    (buffer-string)))
 
 ;;;###autoload
 (defun gnus-convert-png-to-face (file)
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 8c62c94..c8b95d9 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -894,14 +894,14 @@ simple manner."
        ["Sort by real name" gnus-group-sort-selected-groups-by-real-name
         (not (gnus-topic-mode-p))])
        ("Mark"
-       ["Mark group" gnus-group-mark-group
+       ["Toggle/Set mark" gnus-group-mark-group
         (and (gnus-group-group-name)
              (not (memq (gnus-group-group-name) gnus-group-marked)))]
-       ["Unmark group" gnus-group-unmark-group
+       ["Remove mark" gnus-group-unmark-group
         (and (gnus-group-group-name)
              (memq (gnus-group-group-name) gnus-group-marked))]
-       ["Unmark all" gnus-group-unmark-all-groups gnus-group-marked]
-       ["Mark regexp..." gnus-group-mark-regexp t]
+       ["Remove all marks" gnus-group-unmark-all-groups gnus-group-marked]
+       ["Mark by regexp..." gnus-group-mark-regexp t]
        ["Mark region" gnus-group-mark-region :active mark-active]
        ["Mark buffer" gnus-group-mark-buffer t]
        ["Execute command" gnus-group-universal-argument
@@ -1865,7 +1865,7 @@ If FIRST-TOO, the current line is also eligible as a 
target."
     (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2))
     (eq (char-after) gnus-process-mark)))
 
-(defun gnus-group-mark-group (n &optional unmark no-advance)
+(defun gnus-group-mark-group (n &optional unmark no-advance no-toggle)
   "Mark the current group."
   (interactive "p" gnus-group-mode)
   (let ((buffer-read-only nil)
@@ -1877,23 +1877,33 @@ If FIRST-TOO, the current line is also eligible as a 
target."
        (beginning-of-line)
        (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2))
        (delete-char 1)
-       (if unmark
-           (progn
-             (setq gnus-group-marked (delete group gnus-group-marked))
-              (insert-char ?\s 1 t))
-          (setq gnus-group-marked
-                (cons group (delete group gnus-group-marked)))
-          (insert-char gnus-process-mark 1 t)))
+       (if (and gnus-process-mark-toggle (not no-toggle))
+           (if (memq group gnus-group-marked)
+               (gnus-group-mark-update group t)
+             (gnus-group-mark-update group))
+         (gnus-group-mark-update group unmark)))
       (unless no-advance
        (gnus-group-next-group 1))
       (cl-decf n))
     (gnus-group-position-point)
     n))
 
+(defun gnus-group-mark-update (n &optional unmark)
+  "Set the process mark on current group and update the group line."
+  (if unmark
+      (progn
+       (setq gnus-group-marked
+             (delete n gnus-group-marked))
+       (insert-char ?\s 1 t))
+    (progn
+      (setq gnus-group-marked
+           (cons n (delete n gnus-group-marked)))
+      (insert-char gnus-process-mark 1 t))))
+
 (defun gnus-group-unmark-group (n)
   "Remove the mark from the current group."
   (interactive "p" gnus-group-mode)
-  (gnus-group-mark-group n 'unmark)
+  (gnus-group-mark-group n 'unmark nil t)
   (gnus-group-position-point))
 
 (defun gnus-group-unmark-all-groups ()
@@ -1910,7 +1920,7 @@ If UNMARK, remove the mark instead."
   (let ((num (count-lines beg end)))
     (save-excursion
       (goto-char beg)
-      (- num (gnus-group-mark-group num unmark)))))
+      (- num (gnus-group-mark-group num unmark nil t)))))
 
 (defun gnus-group-mark-buffer (&optional unmark)
   "Mark all groups in the buffer.
@@ -1935,7 +1945,7 @@ If UNMARK, remove the mark instead."
 Return nil if the group isn't displayed."
   (if (gnus-group-goto-group group nil test-marked)
       (save-excursion
-       (gnus-group-mark-group 1 'unmark t)
+       (gnus-group-mark-group 1 'unmark t t)
        t)
     (setq gnus-group-marked
          (delete group gnus-group-marked))
@@ -1945,7 +1955,7 @@ Return nil if the group isn't displayed."
   "Set the process mark on GROUP."
   (if (gnus-group-goto-group group)
       (save-excursion
-       (gnus-group-mark-group 1 nil t))
+       (gnus-group-mark-group 1 nil t t))
     (setq gnus-group-marked (cons group (delete group gnus-group-marked)))))
 
 (defun gnus-group-universal-argument (arg &optional _groups func)
diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index 61a1d67..70bde26 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -1278,24 +1278,30 @@ elements are present."
       str)))
 
 (defun gnus-search-imap-handle-flag (flag)
-  "Make sure string FLAG is something IMAP will recognize."
-  ;; What else?  What about the KEYWORD search key?
+  "Adjust string FLAG to help IMAP recognize it.
+If it's one of the RFC3501 flags, make sure it's upcased.
+Otherwise, if FLAG starts with a \"$\", treat as a KEYWORD
+search.  Otherwise, drop the flag."
   (setq flag
        (pcase flag
          ("flag" "flagged")
          ("read" "seen")
          ("replied" "answered")
          (_ flag)))
-  (if (member flag '("seen" "answered" "deleted" "draft" "flagged"))
-      (upcase flag)
-    ""))
+  (cond
+   ((member flag '("seen" "answered" "deleted" "draft" "flagged" "recent"))
+    (upcase flag))
+   ((string-prefix-p "$" flag)
+    (format "KEYWORD %s" flag))
+   ;; TODO: Provide a user option to treat *all* marks as a KEYWORDs?
+   (t "")))
 
 ;;; Methods for the indexed search engines.
 
 ;; First, some common methods.
 
-(cl-defgeneric gnus-search-indexed-parse-output (engine server &optional 
groups)
-  "Parse the results of ENGINE's query against SERVER in GROUPS.
+(cl-defgeneric gnus-search-indexed-parse-output (engine server query &optional 
groups)
+  "Parse the results of ENGINE's QUERY against SERVER in GROUPS.
 Locally-indexed search engines return results as a list of
 filenames, sometimes with additional information.  Returns a list
 of viable results, in the form of a list of [group article score]
@@ -1358,9 +1364,12 @@ Returns a list of [group article score] vectors."
                         "\\|")))
        artlist vectors article group)
     (goto-char (point-min))
-    (while (not (eobp))
+    (while (not (or (eobp)
+                    (looking-at-p
+                     "\\(?:[[:space:]\n]+\\)?Process .+ finished")))
       (pcase-let ((`(,f-name ,score) (gnus-search-indexed-extract engine)))
-       (when (and (file-readable-p f-name)
+       (when (and f-name
+                   (file-readable-p f-name)
                   (null (file-directory-p f-name))
                   (or (null groups)
                       (and (gnus-search-single-p query)
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index aa4c753..4bdc202 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -879,8 +879,9 @@ this reverses the sort order.
 
 Ready-made functions include `gnus-article-sort-by-number',
 `gnus-article-sort-by-author', `gnus-article-sort-by-subject',
-`gnus-article-sort-by-date', `gnus-article-sort-by-random'
-and `gnus-article-sort-by-score'.
+`gnus-article-sort-by-date', `gnus-article-sort-by-score',
+`gnus-article-sort-by-rsv', `gnus-article-sort-by-newsgroups',
+and `gnus-article-sort-by-random'.
 
 When threading is turned on, the variable `gnus-thread-sort-functions'
 controls how articles are sorted."
@@ -892,6 +893,7 @@ controls how articles are sorted."
                           (function-item gnus-article-sort-by-date)
                           (function-item gnus-article-sort-by-score)
                           (function-item gnus-article-sort-by-rsv)
+                          (function-item gnus-article-sort-by-newsgroups)
                           (function-item gnus-article-sort-by-random)
                           (function :tag "other"))
                   (boolean :tag "Reverse order"))))
@@ -916,8 +918,8 @@ Ready-made functions include `gnus-thread-sort-by-number',
 `gnus-thread-sort-by-author', `gnus-thread-sort-by-recipient'
 `gnus-thread-sort-by-subject', `gnus-thread-sort-by-date',
 `gnus-thread-sort-by-score', `gnus-thread-sort-by-most-recent-number',
-`gnus-thread-sort-by-most-recent-date', `gnus-thread-sort-by-random',
-and `gnus-thread-sort-by-total-score' (see
+`gnus-thread-sort-by-most-recent-date', `gnus-thread-sort-by-newsgroups',
+`gnus-thread-sort-by-random', and `gnus-thread-sort-by-total-score' (see
 `gnus-thread-score-function').
 
 When threading is turned off, the variable
@@ -938,6 +940,7 @@ subthreads, customize `gnus-subthread-sort-functions'."
                    (function-item gnus-thread-sort-by-rsv)
                    (function-item gnus-thread-sort-by-most-recent-number)
                    (function-item gnus-thread-sort-by-most-recent-date)
+                   (function-item gnus-thread-sort-by-newsgroups)
                    (function-item gnus-thread-sort-by-random)
                    (function-item gnus-thread-sort-by-total-score)
                    (function :tag "other"))
@@ -961,6 +964,7 @@ according to the value of `gnus-thread-sort-functions'."
                    (function-item gnus-thread-sort-by-score)
                    (function-item gnus-thread-sort-by-most-recent-number)
                    (function-item gnus-thread-sort-by-most-recent-date)
+                    (function-item gnus-thread-sort-by-newsgroups)
                    (function-item gnus-thread-sort-by-random)
                    (function-item gnus-thread-sort-by-total-score)
                    (function :tag "other"))
@@ -1976,6 +1980,8 @@ increase the score of each group you read."
   "\C-c\C-s\C-i" gnus-summary-sort-by-score
   "\C-c\C-s\C-o" gnus-summary-sort-by-original
   "\C-c\C-s\C-r" gnus-summary-sort-by-random
+  "\C-c\C-s\C-u" gnus-summary-sort-by-newsgroups
+  "\C-c\C-s\C-x" gnus-summary-sort-by-extra
   "=" gnus-summary-expand-window
   "\C-x\C-s" gnus-summary-reselect-current-group
   "\M-g" gnus-summary-rescan-group
@@ -2774,7 +2780,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Hide marked" gnus-summary-limit-exclude-marks t]
         ["Show expunged" gnus-summary-limit-include-expunged t])
        ("Process Mark"
-        ["Set mark" gnus-summary-mark-as-processable t]
+        ["Toggle/Set mark" gnus-summary-mark-as-processable t]
         ["Remove mark" gnus-summary-unmark-as-processable t]
         ["Remove all marks" gnus-summary-unmark-all-processable t]
         ["Invert marks" gnus-uu-invert-processable t]
@@ -2831,6 +2837,8 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Sort by lines" gnus-summary-sort-by-lines t]
         ["Sort by characters" gnus-summary-sort-by-chars t]
         ["Sort by marks" gnus-summary-sort-by-marks t]
+        ["Sort by newsgroup" gnus-summary-sort-by-newsgroups t]
+        ["Sort by extra" gnus-summary-sort-by-extra t]
         ["Randomize" gnus-summary-sort-by-random t]
         ["Original sort" gnus-summary-sort-by-original t])
        ("Help"
@@ -5075,17 +5083,17 @@ using some other form will lead to serious barfage."
   (gnus-article-sort-by-author
    (gnus-thread-header h1)  (gnus-thread-header h2)))
 
+(defsubst gnus-article-sort-extract-extra (name header)
+  (let ((extract
+        (funcall gnus-extract-address-components
+                 (or (cdr (assq name (mail-header-extra header)))
+                     ""))))
+    (or (car extract) (cadr extract))))
+
 (defsubst gnus-article-sort-by-recipient (h1 h2)
   "Sort articles by recipient."
-  (gnus-string<
-   (let ((extract (funcall
-                  gnus-extract-address-components
-                  (or (cdr (assq 'To (mail-header-extra h1))) ""))))
-     (or (car extract) (cadr extract)))
-   (let ((extract (funcall
-                  gnus-extract-address-components
-                  (or (cdr (assq 'To (mail-header-extra h2))) ""))))
-     (or (car extract) (cadr extract)))))
+  (let ((ex (lambda (h) (gnus-article-sort-extract-extra 'To h))))
+    (gnus-string< (funcall ex h1) (funcall ex h2))))
 
 (defun gnus-thread-sort-by-recipient (h1 h2)
   "Sort threads by root recipient."
@@ -5180,6 +5188,16 @@ Unscored articles will be counted as having a score of 
zero."
   "Sort threads such that the thread with the most recently dated article 
comes first."
   (> (gnus-thread-latest-date h1) (gnus-thread-latest-date h2)))
 
+(defsubst gnus-article-sort-by-newsgroups (h1 h2)
+  "Sort articles by newsgroups."
+  (let ((ex (lambda (h) (gnus-article-sort-extract-extra 'Newsgroups h))))
+    (gnus-string< (funcall ex h1) (funcall ex h2))))
+
+(defun gnus-thread-sort-by-newsgroups (h1 h2)
+  "Sort threads by root newsgroups."
+  (gnus-article-sort-by-newsgroups
+   (gnus-thread-header h1) (gnus-thread-header h2)))
+
 ; Since this is called not only to sort the top-level threads, but
 ; also in recursive sorts to order the articles within a thread, each
 ; article will be processed many times.  Thus it speeds things up
@@ -8247,7 +8265,7 @@ If NOT-MATCHING, excluding articles that have subjects 
that match a regexp."
        (let ((articles (gnus-summary-find-matching
                         (or header "subject") subject 'all nil nil
                         not-matching)))
-         (unless articles
+         (unless (or articles not-matching)
            (error "Found no matches for \"%s\"" subject))
          (gnus-summary-limit articles))
       (gnus-summary-position-point))))
@@ -8318,7 +8336,7 @@ To and Cc headers are checked.  You need to include them 
in
                                 (and (memq a to) a))
                               cc)
                     (nconc to cc))))
-            (unless articles
+            (unless (or articles not-matching)
               (error "Found no matches for \"%s\"" recipient))
             (gnus-summary-limit articles))
       (gnus-summary-position-point))))
@@ -8374,7 +8392,7 @@ in `nnmail-extra-headers'."
                     (nconc (if (eq to t) nil to)
                            (if (eq cc t) nil cc)
                            from))))
-            (unless articles
+            (unless (or articles not-matching)
               (error "Found no matches for \"%s\"" address))
             (gnus-summary-limit articles))
       (gnus-summary-position-point))))
@@ -8465,7 +8483,7 @@ articles that are younger than AGE days."
        (let ((articles (gnus-summary-find-matching
                         (cons 'extra header) regexp 'all nil nil
                         not-matching)))
-         (unless articles
+         (unless (or articles not-matching)
            (error "Found no matches for \"%s\"" regexp))
          (gnus-summary-limit articles))
       (gnus-summary-position-point))))
@@ -10951,10 +10969,14 @@ number of articles marked is returned."
          (n (abs n)))
       (while (and
              (> n 0)
-             (if unmark
-                 (gnus-summary-remove-process-mark
-                  (gnus-summary-article-number))
-               (gnus-summary-set-process-mark (gnus-summary-article-number)))
+             (let ((article (gnus-summary-article-number)))
+               (if unmark
+                   (gnus-summary-remove-process-mark article)
+                 (if gnus-process-mark-toggle
+                     (if (memq article gnus-newsgroup-processable)
+                         (gnus-summary-remove-process-mark article)
+                       (gnus-summary-set-process-mark article))
+                   (gnus-summary-set-process-mark article))))
              (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))
        (setq n (1- n)))
       (when (/= 0 n)
@@ -12118,6 +12140,12 @@ Argument REVERSE means reverse order."
   (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'marks reverse))
 
+(defun gnus-summary-sort-by-newsgroups (&optional reverse)
+  "Sort the summary buffer by newsgroups alphabetically.
+Argument REVERSE means reverse order."
+  (interactive "P" gnus-summary-mode)
+  (gnus-summary-sort 'newsgroups reverse))
+
 (defun gnus-summary-sort-by-original (&optional _reverse)
   "Sort the summary buffer using the default sorting method.
 Argument REVERSE means reverse order."
@@ -12129,6 +12157,24 @@ Argument REVERSE means reverse order."
     ;; Hide subthreads if needed.
     (gnus-summary-maybe-hide-threads)))
 
+(defun gnus-summary-sort-by-extra (&optional reverse)
+  "Sort the summary buffer using an extra header.
+Argument REVERSE means reverse order."
+  (interactive "P" gnus-summary-mode)
+  (let* ((extra-header
+         (gnus-completing-read "Sort by extra header"
+          (mapcar #'symbol-name gnus-extra-headers)
+          t nil nil
+          (symbol-name
+           (car gnus-extra-headers))))
+       (header (downcase extra-header)))
+    (if (and (fboundp (intern
+                      (format "gnus-thread-sort-by-%s" header)))
+            (fboundp
+             (intern (format "gnus-article-sort-by-%s" header))))
+       (gnus-summary-sort header reverse)
+      (error "No sort function defined for header: %s" extra-header))))
+
 (defun gnus-summary-sort (predicate reverse)
   "Sort summary buffer by PREDICATE.  REVERSE means reverse order."
   (let* ((current (gnus-summary-article-number))
diff --git a/lisp/gnus/gnus-topic.el b/lisp/gnus/gnus-topic.el
index b3d17bc..568fbbc 100644
--- a/lisp/gnus/gnus-topic.el
+++ b/lisp/gnus/gnus-topic.el
@@ -54,6 +54,7 @@ with some simple extensions.
 %n  Topic name.
 %v  Nothing if the topic is visible, \"...\" otherwise.
 %g  Number of groups in the topic.
+%G  Number of groups in the topic and its subtopics.
 %a  Number of unread articles in the groups in the topic.
 %A  Number of unread articles in the groups in the topic and its subtopics.
 
@@ -87,6 +88,7 @@ See Info node `(gnus)Formatting Variables'."
     (?v visible ?s)
     (?i indentation ?s)
     (?g number-of-groups ?d)
+    (?G total-number-of-groups ?d)
     (?a (gnus-topic-articles-in-topic entries) ?d)
     (?A total-number-of-articles ?d)
     (?l level ?d)))
@@ -485,16 +487,18 @@ If LOWEST is non-nil, list all newsgroups of level LOWEST 
or higher."
 If SILENT, don't insert anything.  Return the number of unread
 articles in the topic and its subtopics."
   (let* ((type (pop topicl))
+        (entries-level (if gnus-group-listed-groups
+                           gnus-level-killed
+                         list-level))
+        (all (or predicate gnus-group-listed-groups
+                 (cdr (assq 'visible
+                            (gnus-topic-hierarchical-parameters
+                             (car type))))))
+        (lowest (if gnus-group-listed-groups 0 lowest))
         (entries (gnus-topic-find-groups
-                  (car type)
-                  (if gnus-group-listed-groups
-                      gnus-level-killed
-                    list-level)
-                  (or predicate gnus-group-listed-groups
-                      (cdr (assq 'visible
-                                 (gnus-topic-hierarchical-parameters
-                                  (car type)))))
-                  (if gnus-group-listed-groups 0 lowest)))
+                  (car type) entries-level all lowest))
+        (all-groups (gnus-topic-find-groups
+                     (car type) entries-level all lowest t))
         (visiblep (and (eq (nth 1 type) 'visible) (not silent)))
         (gnus-group-indentation
          (make-string (* gnus-topic-indent-level level) ? ))
@@ -573,7 +577,7 @@ articles in the topic and its subtopics."
       (gnus-topic-insert-topic-line
        (car type) visiblep
        (not (eq (nth 2 type) 'hidden))
-       level all-entries unread))
+       level all-entries unread all-groups))
     (gnus-topic-update-unreads (car type) unread)
     (gnus-group--setup-tool-bar-update beg end)
     (goto-char end)
@@ -627,10 +631,10 @@ articles in the topic and its subtopics."
 (defvar gnus-tmp-header)
 
 (defun gnus-topic-insert-topic-line (name visiblep shownp level entries
-                                         &optional unread)
+                                         &optional unread all-groups)
   (gnus--\,@
    (let ((vars '(indentation visible name level number-of-groups
-                 total-number-of-articles entries)))
+                 total-number-of-groups total-number-of-articles entries)))
      `((with-suppressed-warnings ((lexical ,@vars))
          ,@(mapcar (lambda (s) `(defvar ,s)) vars)))))
   (let* ((visible (if visiblep "" "..."))
@@ -639,6 +643,7 @@ articles in the topic and its subtopics."
         (indentation (make-string (* gnus-topic-indent-level level) ? ))
         (total-number-of-articles unread)
         (number-of-groups (length entries))
+        (total-number-of-groups (length all-groups))
         (active-topic (eq gnus-topic-alist gnus-topic-active-alist))
         gnus-tmp-header)
     (gnus-topic-update-unreads name unread)
@@ -731,6 +736,9 @@ articles in the topic and its subtopics."
         (entries (gnus-topic-find-groups
                   (car type) (car gnus-group-list-mode)
                   (cdr gnus-group-list-mode)))
+        (all-groups (gnus-topic-find-groups
+                  (car type) (car gnus-group-list-mode)
+                  (cdr gnus-group-list-mode) nil t))
        entry)
     (while children
       (cl-incf unread (gnus-topic-unread (caar (pop children)))))
@@ -738,7 +746,7 @@ articles in the topic and its subtopics."
       (when (numberp (car entry))
        (cl-incf unread (car entry))))
     (gnus-topic-insert-topic-line
-     topic t t (car (gnus-topic-find-topology topic)) nil unread)))
+     topic t t (car (gnus-topic-find-topology topic)) nil unread all-groups)))
 
 (defun gnus-topic-goto-missing-topic (topic)
   (if (gnus-topic-goto-topic topic)
@@ -768,6 +776,9 @@ articles in the topic and its subtopics."
         (entries (gnus-topic-find-groups
                   (car type) (car gnus-group-list-mode)
                   (cdr gnus-group-list-mode)))
+        (all-groups (gnus-topic-find-groups
+                  (car type) (car gnus-group-list-mode)
+                  (cdr gnus-group-list-mode) t))
         (parent (gnus-topic-parent-topic topic-name))
         (all-entries entries)
         (unread 0)
@@ -786,7 +797,7 @@ articles in the topic and its subtopics."
       (gnus-topic-insert-topic-line
        (car type) (gnus-topic-visible-p)
        (not (eq (nth 2 type) 'hidden))
-       (gnus-group-topic-level) all-entries unread)
+       (gnus-group-topic-level) all-entries unread all-groups)
       (gnus-delete-line)
       (forward-line -1)
       (setq new-unread (gnus-group-topic-unread)))
@@ -1112,7 +1123,7 @@ articles in the topic and its subtopics."
        ["Delete" gnus-topic-delete t]
        ["Rename..." gnus-topic-rename t]
        ["Create..." gnus-topic-create-topic t]
-       ["Mark" gnus-topic-mark-topic t]
+       ["Toggle/Set mark" gnus-topic-mark-topic t]
        ["Indent" gnus-topic-indent t]
        ["Sort" gnus-topic-sort-topics t]
        ["Previous topic" gnus-topic-goto-previous-topic t]
@@ -1436,7 +1447,7 @@ If PERMANENT, make it stay shown in subsequent sessions 
as well."
        (setcar (cdr (cadr topic)) 'visible)
        (gnus-group-list-groups)))))
 
-(defun gnus-topic-mark-topic (topic &optional unmark non-recursive)
+(defun gnus-topic-mark-topic (topic &optional unmark non-recursive no-toggle)
   "Mark all groups in the TOPIC with the process mark.
 If NON-RECURSIVE (which is the prefix) is t, don't mark its subtopics."
   (interactive
@@ -1450,8 +1461,13 @@ If NON-RECURSIVE (which is the prefix) is t, don't mark 
its subtopics."
       (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil
                                            (not non-recursive))))
        (while groups
-         (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
-                  (gnus-info-group (nth 1 (pop groups)))))))))
+          (let ((group (gnus-info-group (nth 1 (pop groups)))))
+           (if (and gnus-process-mark-toggle (not no-toggle))
+                (if (memq group gnus-group-marked)
+                    (gnus-group-remove-mark group )
+                  (gnus-group-set-mark group))
+              (if unmark (gnus-group-remove-mark group)
+                (gnus-group-set-mark group)))))))))
 
 (defun gnus-topic-unmark-topic (topic &optional _dummy non-recursive)
   "Remove the process mark from all groups in the TOPIC.
@@ -1462,7 +1478,7 @@ If NON-RECURSIVE (which is the prefix) is t, don't unmark 
its subtopics."
               gnus-topic-mode)
   (if (not topic)
       (call-interactively 'gnus-group-unmark-group)
-    (gnus-topic-mark-topic topic t non-recursive)))
+    (gnus-topic-mark-topic topic t non-recursive t)))
 
 (defun gnus-topic-get-new-news-this-topic (&optional n)
   "Check for new news in the current topic."
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index e558f63..be02845 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -1291,61 +1291,6 @@ forbidden in URL encoding."
     (setq tmp (concat tmp str))
     tmp))
 
-(defun gnus-base64-repad (str &optional reject-newlines line-length no-check)
-  "Take a base 64-encoded string and return it padded correctly.
-Existing padding is ignored.
-
-If any combination of CR and LF characters are present and
-REJECT-NEWLINES is nil, remove them; otherwise raise an error.
-If LINE-LENGTH is set and the string (or any line in the string
-if REJECT-NEWLINES is nil) is longer than that number, raise an
-error.  Common line length for input characters are 76 plus CRLF
-\(RFC 2045 MIME), 64 plus CRLF (RFC 1421 PEM), and 1000 including
-CRLF (RFC 5321 SMTP).
-
-If NOCHECK, don't check anything, but just repad."
-  ;; RFC 4648 specifies that:
-  ;; - three 8-bit inputs make up a 24-bit group
-  ;; - the 24-bit group is broken up into four 6-bit values
-  ;; - each 6-bit value is mapped to one character of the base 64 alphabet
-  ;; - if the final 24-bit quantum is filled with only 8 bits the output
-  ;;   will be two base 64 characters followed by two "=" padding characters
-  ;; - if the final 24-bit quantum is filled with only 16 bits the output
-  ;;   will be three base 64 character followed by one "=" padding character
-  ;;
-  ;; RFC 4648 section 3 considerations:
-  ;; - if reject-newlines is nil (default), concatenate multi-line
-  ;;   input (3.1, 3.3)
-  ;; - if line-length is set, error on input exceeding the limit (3.1)
-  ;; - reject characters outside base encoding (3.3, also section 12)
-  ;;
-  ;; RFC 5322 section 2.2.3 consideration:
-  ;; Because base 64-encoded strings can appear in long header fields, remove
-  ;; folding whitespace while still observing the RFC 4648 decisions above.
-  (when no-check
-    (setq str (replace-regexp-in-string "[\n\r \t]+" "" str)));
-  (let ((splitstr (split-string str "[ \t]*[\r\n]+[ \t]?" t)))
-    (when (and reject-newlines (> (length splitstr) 1))
-      (error "Invalid Base64 string"))
-    (dolist (substr splitstr)
-      (when (and line-length (> (length substr) line-length))
-       (error "Base64 string exceeds line-length"))
-      (when (string-match "[^A-Za-z0-9+/=]" substr)
-       (error "Invalid Base64 string")))
-    (let* ((str (string-join splitstr))
-          (len (length str)))
-      (when (string-match "=" str)
-       (setq len (match-beginning 0)))
-      (concat
-       (substring str 0 len)
-       (make-string (/
-                    (- 24
-                       (pcase (mod (* len 6) 24)
-                         (`0 24)
-                         (n n)))
-                    6)
-                   ?=)))))
-
 (defun gnus-make-predicate (spec)
   "Transform SPEC into a function that can be called.
 SPEC is a predicate specifier that contains stuff like `or', `and',
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 7de1cd1..7dde799 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -1183,6 +1183,14 @@ newsgroups."
   :group 'gnus-summary-marks
   :type 'character)
 
+(defcustom gnus-process-mark-toggle t
+  "If nil the process mark command only sets the process mark."
+  :version "28.1"
+  :group 'gnus-summary
+  :group 'gnus-group-various
+  :group 'gnus-group-topic
+  :type 'boolean)
+
 (defcustom gnus-large-newsgroup 200
   "The number of articles which indicates a large newsgroup.
 If the number of articles in a newsgroup is greater than this value,
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 02db387..a9be2d6 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -8722,17 +8722,18 @@ Header and body are separated by 
`mail-header-separator'."
 
 (defun message-replace-header (header new-value &optional after force)
   "Remove HEADER and insert the NEW-VALUE.
-If AFTER, insert after this header.  If FORCE, insert new field
-even if NEW-VALUE is empty."
+If AFTER, insert after this header.  AFTER may be a list of
+headers.  If FORCE, insert new field even if NEW-VALUE is empty."
   ;; Similar to `nnheader-replace-header' but for message buffers.
   (save-excursion
     (save-restriction
       (message-narrow-to-headers)
       (message-remove-header header))
     (when (or force (> (length new-value) 0))
-      (if after
-         (message-position-on-field header after)
-       (message-position-on-field header))
+      (apply #'message-position-on-field header
+             (if (listp after)
+                 after
+               (list after)))
       (insert new-value))))
 
 (make-obsolete-variable
diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el
index dcc9ea5..5f35e73 100644
--- a/lisp/gnus/mml.el
+++ b/lisp/gnus/mml.el
@@ -550,7 +550,7 @@ type detected."
                 (end (point))
                 (parsed (url-generic-parse-url (cdr (assq 'src (cadr img))))))
            (when (and (null (url-type parsed))
-                      (url-filename parsed)
+                       (not (zerop (length (url-filename parsed))))
                       (file-exists-p (url-filename parsed)))
              (goto-char start)
              (when (search-forward (url-filename parsed) end t)
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 8990b2b..3e2a202 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -136,6 +136,16 @@ will fetch all parts that have types that match that 
string.  A
 likely value would be \"text/\" to automatically fetch all
 textual parts.")
 
+(defvoo nnimap-keepalive-intervals (cons (* 60 15)
+                                         (* 60 5))
+  "Configuration for the nnimap keepalive timer.
+The value is a cons of two integers (each representing a number
+of seconds): the first is how often to run the keepalive
+function, the second is the seconds of inactivity required to
+send the actual keepalive command.
+
+Set to nil to disable keepalive commands altogether.")
+
 (defgroup nnimap nil
   "IMAP for Gnus."
   :group 'gnus)
@@ -405,20 +415,22 @@ during splitting, which may be slow."
       nil)))
 
 (defun nnimap-keepalive ()
-  (let ((now (current-time)))
+  (let ((now (current-time))
+        ;; Set this so we don't wait for a response.
+        (nnimap-streaming t))
     (dolist (buffer nnimap-process-buffers)
       (when (buffer-live-p buffer)
        (with-current-buffer buffer
          (when (and nnimap-object
                     (nnimap-last-command-time nnimap-object)
                     (time-less-p
-                     ;; More than five minutes since the last command.
-                     (* 5 60)
+                     (cdr nnimap-keepalive-intervals)
                      (time-subtract
                       now
                       (nnimap-last-command-time nnimap-object))))
-            (ignore-errors              ;E.g. "buffer foo has no process".
-              (nnimap-send-command "NOOP"))))))))
+            (with-local-quit
+              (ignore-errors          ;E.g. "buffer foo has no process".
+                (nnimap-send-command "NOOP")))))))))
 
 (defun nnimap-open-connection (buffer)
   ;; Be backwards-compatible -- the earlier value of nnimap-stream was
@@ -448,9 +460,12 @@ during splitting, which may be slow."
     port))
 
 (defun nnimap-open-connection-1 (buffer)
-  (unless nnimap-keepalive-timer
-    (setq nnimap-keepalive-timer (run-at-time (* 60 15) (* 60 15)
-                                             #'nnimap-keepalive)))
+  (unless (or nnimap-keepalive-timer
+              (null nnimap-keepalive-intervals))
+    (setq nnimap-keepalive-timer (run-at-time
+                                  (car nnimap-keepalive-intervals)
+                                  (car nnimap-keepalive-intervals)
+                                 #'nnimap-keepalive)))
   (with-current-buffer (nnimap-make-process-buffer buffer)
     (let* ((coding-system-for-read 'binary)
           (coding-system-for-write 'binary)
@@ -1062,7 +1077,9 @@ during splitting, which may be slow."
                   "UID COPY %s %S")
                 (nnimap-article-ranges (gnus-compress-sequence articles))
                 (nnimap-group-to-imap (gnus-group-real-name 
nnmail-expiry-target)))
-               (set (if can-move 'deleted-articles 'articles-to-delete) 
articles))))
+               (if can-move
+                   (setq deleted-articles articles)
+                 (setq articles-to-delete articles)))))
       t)
      (t
       (dolist (article articles)
diff --git a/lisp/gnus/nnoo.el b/lisp/gnus/nnoo.el
index 7759951..4e84901 100644
--- a/lisp/gnus/nnoo.el
+++ b/lisp/gnus/nnoo.el
@@ -34,6 +34,7 @@
 (defmacro defvoo (var init &optional doc &rest map)
   "The same as `defvar', only takes list of variables to MAP to."
   (declare (indent 2)
+           (doc-string 3)
            (debug (var init &optional doc &rest map)))
   `(prog1
        ,(if doc
@@ -44,6 +45,7 @@
 (defmacro deffoo (func args &rest forms)
   "The same as `defun', only register FUNC."
   (declare (indent 2)
+           (doc-string 3)
            (debug (&define name lambda-list def-body)))
   `(prog1
        (defun ,func ,args ,@forms)
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index 5ac4c3a..ecec705 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -777,7 +777,7 @@ If this variable is nil, or if the provided function 
returns nil,
 Return an article list."
   (let ((func (alist-get 'nnselect-function specs))
        (args (alist-get 'nnselect-args specs)))
-    (condition-case err
+    (condition-case-unless-debug err
        (funcall func args)
       (error (gnus-error 3 "nnselect-run: %s on %s gave error %s" func args 
err)
             []))))
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index e20a1a5..afdb0d1 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -126,29 +126,37 @@ with the current prefix.  The files are chosen according 
to
   :group 'help
   :version "26.3")
 
+(defun help--symbol-class (s)
+  "Return symbol class characters for symbol S."
+  (when (stringp s)
+    (setq s (intern-soft s)))
+  (concat
+   (when (fboundp s)
+     (concat
+      (cond
+       ((commandp s) "c")
+       ((eq (car-safe (symbol-function s)) 'macro) "m")
+       (t "f"))
+      (and (let ((flist (indirect-function s)))
+             (advice--p (if (eq 'macro (car-safe flist)) (cdr flist) flist)))
+           "!")
+      (and (get s 'byte-obsolete-info) "-")))
+   (when (boundp s)
+     (concat
+      (if (custom-variable-p s) "u" "v")
+      (and (local-variable-if-set-p s) "'")
+      (and (ignore-errors (not (equal (symbol-value s) (default-value s)))) 
"*")
+      (and (get s 'byte-obsolete-variable) "-")))
+   (and (facep s) "a")
+   (and (fboundp 'cl-find-class) (cl-find-class s) "t")))
+
 (defun help--symbol-completion-table-affixation (completions)
   (mapcar (lambda (c)
             (let* ((s (intern c))
                    (doc (condition-case nil (documentation s) (error nil)))
                    (doc (and doc (substring doc 0 (string-match "\n" doc)))))
               (list c (propertize
-                       (concat (cond ((commandp s)
-                                      "c") ; command
-                                     ((eq (car-safe (symbol-function s)) 
'macro)
-                                      "m") ; macro
-                                     ((fboundp s)
-                                      "f") ; function
-                                     ((custom-variable-p s)
-                                      "u") ; user option
-                                     ((boundp s)
-                                      "v") ; variable
-                                     ((facep s)
-                                      "a") ; fAce
-                                     ((and (fboundp 'cl-find-class)
-                                           (cl-find-class s))
-                                      "t")  ; CL type
-                                     (" ")) ; something else
-                               " ")         ; prefix separator
+                       (format "%-4s" (help--symbol-class s))
                        'face 'completions-annotations)
                     (if doc (propertize (format " -- %s" doc)
                                         'face 'completions-annotations)
@@ -174,26 +182,47 @@ with the current prefix.  The files are chosen according 
to
 Functions on `help-fns-describe-function-functions' can use this
 to get buffer-local values.")
 
+(defun help-fns--describe-function-or-command-prompt (&optional want-command)
+  "Prompt for a function from `describe-function' or `describe-command'.
+If optional argument WANT-COMMAND is non-nil, prompt for an
+interactive command."
+  (let* ((fn (if want-command
+                 (caar command-history)
+               (function-called-at-point)))
+         (prompt (format-prompt (if want-command
+                                    "Describe command"
+                                  "Describe function")
+                                fn))
+         (enable-recursive-minibuffers t)
+         (val (completing-read
+               prompt
+               #'help--symbol-completion-table
+               (lambda (f) (if want-command
+                          (commandp f)
+                        (or (fboundp f) (get f 'function-documentation))))
+               t nil nil
+               (and fn (symbol-name fn)))))
+    (unless (equal val "")
+      (setq fn (intern val)))
+    ;; These error messages are intended to be less technical for the
+    ;; `describe-command' case, as they are directed at users that are
+    ;; not necessarily ELisp programmers.
+    (unless (and fn (symbolp fn))
+      (user-error (if want-command
+                      "You didn't specify a command's symbol"
+                    "You didn't specify a function symbol")))
+    (unless (or (fboundp fn) (get fn 'function-documentation))
+      (user-error (if want-command
+                      "Symbol is not a command: %s"
+                    "Symbol's function definition is void: %s")
+                  fn))
+    (list fn)))
+
 ;;;###autoload
 (defun describe-function (function)
   "Display the full documentation of FUNCTION (a symbol).
 When called from lisp, FUNCTION may also be a function object."
-  (interactive
-   (let* ((fn (function-called-at-point))
-          (enable-recursive-minibuffers t)
-          (val (completing-read
-                (format-prompt "Describe function" fn)
-                #'help--symbol-completion-table
-                (lambda (f) (or (fboundp f) (get f 'function-documentation)))
-                t nil nil
-                (and fn (symbol-name fn)))))
-     (unless (equal val "")
-       (setq fn (intern val)))
-     (unless (and fn (symbolp fn))
-       (user-error "You didn't specify a function symbol"))
-     (unless (or (fboundp fn) (get fn 'function-documentation))
-       (user-error "Symbol's function definition is void: %s" fn))
-     (list fn)))
+  (interactive (help-fns--describe-function-or-command-prompt))
 
   ;; We save describe-function-orig-buffer on the help xref stack, so
   ;; it is restored by the back/forward buttons.  'help-buffer'
@@ -223,9 +252,14 @@ When called from lisp, FUNCTION may also be a function 
object."
         (describe-function-1 function)
         (with-current-buffer standard-output
           ;; Return the text we displayed.
-          (buffer-string))))
-    ))
+          (buffer-string))))))
 
+;;;###autoload
+(defun describe-command (command)
+  "Display the full documentation of COMMAND (a symbol).
+When called from lisp, COMMAND may also be a function object."
+  (interactive (help-fns--describe-function-or-command-prompt 'is-command))
+  (describe-function command))
 
 ;; Could be this, if we make symbol-file do the work below.
 ;; (defun help-C-file-name (subr-or-var kind)
@@ -242,7 +276,9 @@ If we can't find the file name, nil is returned."
   (let ((docbuf (get-buffer-create " *DOC*"))
        (name (if (eq 'var kind)
                  (concat "V" (symbol-name subr-or-var))
-               (concat "F" (subr-name (advice--cd*r subr-or-var))))))
+               (concat "F" (if (symbolp subr-or-var)
+                                (symbol-name subr-or-var)
+                              (subr-name (advice--cd*r subr-or-var)))))))
     (with-current-buffer docbuf
       (goto-char (point-min))
       (if (eobp)
@@ -853,7 +889,9 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
                                       nil t)
              (help-xref-button 1 'help-function real-def)))))
 
-      (when file-name
+      (if (not file-name)
+         (with-current-buffer standard-output
+            (setq help-mode--current-data (list :symbol function)))
        ;; We used to add .el to the file name,
        ;; but that's completely wrong when the user used load-file.
        (princ (format-message " in `%s'"
@@ -862,6 +900,8 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
                                  (help-fns-short-filename file-name))))
        ;; Make a hyperlink to the library.
        (with-current-buffer standard-output
+          (setq help-mode--current-data (list :symbol function
+                                              :file file-name))
          (save-excursion
            (re-search-backward (substitute-command-keys "`\\([^`']+\\)'")
                                 nil t)
@@ -996,12 +1036,12 @@ it is displayed along with the global value."
                 (format-prompt "Describe variable" (and (symbolp v) v))
                 #'help--symbol-completion-table
                 (lambda (vv)
-                  ;; In case the variable only exists in the buffer
-                  ;; the command we switch back to that buffer before
-                  ;; we examine the variable.
-                  (with-current-buffer orig-buffer
-                    (or (get vv 'variable-documentation)
-                        (and (boundp vv) (not (keywordp vv))))))
+                  (or (get vv 'variable-documentation)
+                      (and (not (keywordp vv))
+                           ;; Since the variable may only exist in the
+                           ;; original buffer, we have to look for it
+                           ;; there.
+                           (buffer-local-boundp vv orig-buffer))))
                 t nil nil
                 (if (symbolp v) (symbol-name v))))
      (list (if (equal val "")
@@ -1036,7 +1076,10 @@ it is displayed along with the global value."
                                        "C source code"
                                      (help-fns-short-filename file-name))))
                           (with-current-buffer standard-output
-                            (save-excursion
+                             (setq help-mode--current-data
+                                   (list :symbol variable
+                                         :file file-name))
+                             (save-excursion
                               (re-search-backward (substitute-command-keys
                                                     "`\\([^`']+\\)'")
                                                    nil t)
@@ -1045,6 +1088,8 @@ it is displayed along with the global value."
                           (if valvoid
                               "It is void as a variable."
                              "Its "))
+                      (with-current-buffer standard-output
+                         (setq help-mode--current-data (list :symbol 
variable)))
                        (if valvoid
                           " is void as a variable."
                          (substitute-command-keys "'s ")))))
@@ -1414,7 +1459,10 @@ If FRAME is omitted or nil, use the selected frame."
                   (concat "\\(" customize-label "\\)") nil t)
                  (help-xref-button 1 'help-customize-face f)))
              (setq file-name (find-lisp-object-file-name f 'defface))
-             (when file-name
+             (if (not file-name)
+                  (setq help-mode--current-data (list :symbol f))
+                (setq help-mode--current-data (list :symbol f
+                                                    :file file-name))
                (princ (substitute-command-keys "Defined in `"))
                (princ (help-fns-short-filename file-name))
                (princ (substitute-command-keys "'"))
@@ -1704,7 +1752,9 @@ keymap value."
           (unless used-gentemp
             (princ (format-message "%S is a keymap variable" keymap))
             (if (not file-name)
-                (princ ".\n\n")
+                (progn
+                  (setq help-mode--current-data (list :symbol keymap))
+                  (princ ".\n\n"))
               (princ (format-message
                       " defined in `%s'.\n\n"
                       (if (eq file-name 'C-source)
@@ -1714,6 +1764,8 @@ keymap value."
                 (re-search-backward (substitute-command-keys
                                      "`\\([^`']+\\)'")
                                     nil t)
+                (setq help-mode--current-data (list :symbol keymap
+                                                    :file file-name))
                 (help-xref-button 1 'help-variable-def
                                   keymap file-name))))
           (when (and (not (equal "" doc)) doc)
@@ -1821,7 +1873,8 @@ documentation for the major and minor modes of that 
buffer."
        (princ " mode")
        (let* ((mode major-mode)
               (file-name (find-lisp-object-file-name mode nil)))
-         (when file-name
+         (if (not file-name)
+              (setq help-mode--current-data (list :symbol mode))
            (princ (format-message " defined in `%s'"
                                    (help-fns-short-filename file-name)))
            ;; Make a hyperlink to the library.
@@ -1829,6 +1882,8 @@ documentation for the major and minor modes of that 
buffer."
              (save-excursion
                (re-search-backward (substitute-command-keys "`\\([^`']+\\)'")
                                     nil t)
+                (setq help-mode--current-data (list :symbol mode
+                                                    :file file-name))
                 (help-xref-button 1 'help-function-def mode file-name)))))
         (let ((fundoc (help-split-fundoc (documentation major-mode) nil 'doc)))
           (with-current-buffer standard-output
diff --git a/lisp/help-macro.el b/lisp/help-macro.el
index 7fe1fb6..1fa9d82 100644
--- a/lisp/help-macro.el
+++ b/lisp/help-macro.el
@@ -25,11 +25,12 @@
 
 ;;; Commentary:
 
-;; This file supplies the macro make-help-screen which constructs
-;; single character dispatching with browsable help such as that provided
-;; by help-for-help. This can be used to make many modes easier to use; for
-;; example, the GNU Emacs Empire Tool uses this for every "nested" mode map
-;; called from the main mode map.
+;; This file supplies the macro `make-help-screen' which constructs
+;; single character dispatching with browsable help such as that
+;; provided by `help-for-help'.  This can be used to make many modes
+;; easier to use; for example, the (long-since defunct) GNU Emacs
+;; Empire Tool used this for every "nested" mode map called from the
+;; main mode map.
 
 ;;       The name of this package was changed from help-screen.el to
 ;; help-macro.el in order to fit in a 14-character limit.
@@ -142,7 +143,8 @@ and then returns."
                    (setq new-minor-mode-map-alist minor-mode-map-alist))
                  (goto-char (point-min))
                  (while (or (memq char (append help-event-list
-                                               (cons help-char '( ?? ?\C-v ?\s 
?\177 deletechar backspace vertical-scroll-bar ?\M-v
+                                               (cons help-char '( ?? ?\C-v ?\s 
?\177 ?\M-v ?\S-\s
+                                                                  deletechar 
backspace vertical-scroll-bar
                                                                   next prior 
up down))))
                             (eq (car-safe char) 'switch-frame)
                             (equal key "\M-v"))
@@ -152,7 +154,7 @@ and then returns."
                          (handle-switch-frame char))
                         ((memq char '(?\C-v ?\s next))
                          (scroll-up))
-                        ((or (memq char '(?\177 ?\M-v deletechar backspace 
prior))
+                        ((or (memq char '(?\177 ?\M-v ?\S-\s deletechar 
backspace prior))
                              (equal key "\M-v"))
                          (scroll-down))
                         ((memq char '(down))
@@ -168,9 +170,9 @@ and then returns."
                                              (point-max))
                                             ""
                                           (concat  ", or "
-                                                   
(help--key-description-fontified "\s") ; SPC
+                                                   
(help--key-description-fontified (kbd "<PageDown>"))
                                                    " or "
-                                                   
(help--key-description-fontified "\d") ; DEL
+                                                   
(help--key-description-fontified (kbd "<PageUp>"))
                                                    " to scroll"))))
                            char (aref key 0)))
 
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index c7eaae5..4e73551 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -44,6 +44,9 @@
     (define-key map [XF86Forward] 'help-go-forward)
     (define-key map "\C-c\C-c" 'help-follow-symbol)
     (define-key map "\r" 'help-follow)
+    (define-key map "s" 'help-view-source)
+    (define-key map "i" 'help-goto-info)
+    (define-key map "c" 'help-customize)
     map)
   "Keymap for Help mode.")
 
@@ -61,7 +64,13 @@
     ["Move to Previous Button" backward-button
      :help "Move to the Previous Button in the help buffer"]
     ["Move to Next Button" forward-button
-      :help "Move to the Next Button in the help buffer"]))
+     :help "Move to the Next Button in the help buffer"]
+    ["View Source" help-view-source
+     :help "Go to the source file for the current help item"]
+    ["Goto Info" help-goto-info
+     :help "Go to the info node for the current help item"]
+    ["Customize" help-customize
+     :help "Customize variable or face"]))
 
 (defvar help-mode-tool-bar-map
   (let ((map (make-sparse-keymap)))
@@ -323,6 +332,7 @@ The format is (FUNCTION ARGS...).")
   'help-echo (purecopy "mouse-2, RET: show corresponding NEWS announcement"))
 
 (defvar bookmark-make-record-function)
+(defvar help-mode--current-data nil)
 
 ;;;###autoload
 (define-derived-mode help-mode special-mode "Help"
@@ -334,6 +344,7 @@ Commands:
               #'help-mode-revert-buffer)
   (setq-local tool-bar-map
               help-mode-tool-bar-map)
+  (setq-local help-mode--current-data nil)
   (setq-local bookmark-make-record-function
               #'help-bookmark-make-record))
 
@@ -722,6 +733,32 @@ See `help-make-xrefs'."
       (help-xref-go-forward (current-buffer))
     (user-error "No next help buffer")))
 
+(defun help-view-source ()
+  "View the source of the current help item."
+  (interactive nil help-mode)
+  (unless (plist-get help-mode--current-data :file)
+    (error "Source file for the current help item is not defined"))
+  (help-function-def--button-function (plist-get help-mode--current-data 
:symbol)
+                                      (plist-get help-mode--current-data 
:file)))
+
+(defun help-goto-info ()
+  "View the *info* node of the current help item."
+  (interactive nil help-mode)
+  (unless help-mode--current-data
+    (error "No symbol to look up in the current buffer"))
+  (info-lookup-symbol (plist-get help-mode--current-data :symbol)
+                      'emacs-lisp-mode))
+
+(defun help-customize ()
+  "Customize variable or face whose doc string is shown in the current buffer."
+  (interactive nil help-mode)
+  (let ((sym (plist-get help-mode--current-data :symbol)))
+    (unless (or (boundp sym) (facep sym))
+      (user-error "No variable or face to customize"))
+    (cond
+     ((boundp sym) (customize-variable sym))
+     ((facep sym) (customize-face sym)))))
+
 (defun help-do-xref (_pos function args)
   "Call the help cross-reference function FUNCTION with args ARGS.
 Things are set up properly so that the resulting help-buffer has
diff --git a/lisp/help.el b/lisp/help.el
index 85312a4..1bb1b30 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -106,6 +106,7 @@
     (define-key map "t" 'help-with-tutorial)
     (define-key map "v" 'describe-variable)
     (define-key map "w" 'where-is)
+    (define-key map "x" 'describe-command)
     (define-key map "q" 'help-quit)
     map)
   "Keymap for characters following the Help key.")
@@ -232,10 +233,10 @@ Do not call this in the scope of `with-help-window'."
 (make-help-screen help-for-help
   (purecopy "Type a help option: [abcCdefFgiIkKlLmnprstvw.] C-[cdefmnoptw] or 
?")
   (concat
-   "\(Type "
-   (help--key-description-fontified "\s") ; SPC
+   "(Type "
+   (help--key-description-fontified (kbd "<PageDown>"))
    " or "
-   (help--key-description-fontified "\d") ; DEL
+   (help--key-description-fontified (kbd "<PageUp>"))
    " to scroll, "
    (help--key-description-fontified "\C-s")
    " to search, or \\<help-map>\\[help-quit] to exit.)"
@@ -252,6 +253,7 @@ Do not call this in the scope of `with-help-window'."
         "Search for commands (see also \\[apropos])")
        ("apropos-documentation"
         "Search documentation of functions, variables, and other items")
+       ("describe-command" "Show help for command")
        ("describe-function" "Show help for function")
        ("describe-variable" "Show help for variable")
        ("describe-symbol" "Show help for function or variable"))
@@ -559,6 +561,12 @@ To record all your input, use `open-dribble-file'."
               'font-lock-face 'help-key-binding
               'face 'help-key-binding))
 
+(defcustom describe-bindings-outline nil
+  "Non-nil enables outlines in the output buffer of `describe-bindings'."
+  :type 'boolean
+  :group 'help
+  :version "28.1")
+
 (defun describe-bindings (&optional prefix buffer)
   "Display a buffer showing a list of all defined keys, and their definitions.
 The keys are displayed in order of precedence.
@@ -576,23 +584,26 @@ or a buffer name."
     ;; Be aware that `describe-buffer-bindings' puts its output into
     ;; the current buffer.
     (with-current-buffer (help-buffer)
-      (describe-buffer-bindings buffer prefix))))
-
-(defun describe-bindings-internal (&optional menus prefix)
-  "Show a list of all defined keys, and their definitions.
-We put that list in a buffer, and display the buffer.
-
-The optional argument MENUS, if non-nil, says to mention menu bindings.
-\(Ordinarily these are omitted from the output.)
-The optional argument PREFIX, if non-nil, should be a key sequence;
-then we display only bindings that start with that prefix."
-  (declare (obsolete describe-buffer-bindings "24.4"))
-  (let ((buf (current-buffer)))
-    (with-help-window (help-buffer)
-      ;; Be aware that `describe-buffer-bindings' puts its output into
-      ;; the current buffer.
-      (with-current-buffer (help-buffer)
-       (describe-buffer-bindings buf prefix menus)))))
+      (describe-buffer-bindings buffer prefix)
+
+      (when describe-bindings-outline
+        (setq-local outline-regexp ".*:$")
+        (setq-local outline-heading-end-regexp ":\n")
+        (setq-local outline-level (lambda () 1))
+        (setq-local outline-minor-mode-cycle t
+                    outline-minor-mode-highlight t)
+        (outline-minor-mode 1)
+        (save-excursion
+          (let ((inhibit-read-only t))
+            (goto-char (point-min))
+            (insert (substitute-command-keys
+                     (concat "\\<outline-mode-cycle-map>Type "
+                             "\\[outline-cycle] or \\[outline-cycle-buffer] "
+                             "on headings to cycle their visibility.\n\n")))
+            ;; Hide the longest body
+            (when (and (re-search-forward "Key translations" nil t)
+                       (fboundp 'outline-cycle))
+              (outline-cycle))))))))
 
 (defun where-is (definition &optional insert)
   "Print message listing key sequences that invoke the command DEFINITION.
@@ -1888,7 +1899,7 @@ the same names as used in the original source code, when 
possible."
    ((and (byte-code-function-p def) (listp (aref def 0))) (aref def 0))
    ((eq (car-safe def) 'lambda) (nth 1 def))
    ((eq (car-safe def) 'closure) (nth 2 def))
-   ((and (featurep 'nativecomp)
+   ((and (featurep 'native-compile)
          (subrp def)
          (listp (subr-native-lambda-list def)))
     (subr-native-lambda-list def))
diff --git a/lisp/hexl.el b/lisp/hexl.el
index 85c3a53..8bfc1fb 100644
--- a/lisp/hexl.el
+++ b/lisp/hexl.el
@@ -303,22 +303,30 @@ also supported.
 
 There are several ways to change text in hexl mode:
 
-ASCII characters (character between space (0x20) and tilde (0x7E)) are
-bound to self-insert so you can simply type the character and it will
-insert itself (actually overstrike) into the buffer.
+Self-inserting characters are bound to `hexl-self-insert' so you
+can simply type the character and it will insert itself (actually
+overstrike) into the buffer.  However, inserting non-ASCII characters
+requires caution: the buffer's coding-system should correspond to
+the encoding on disk, and multibyte characters should be inserted
+with cursor on the first byte of a multibyte sequence whose length
+is identical to the length of the multibyte sequence to be inserted,
+otherwise this could produce invalid multibyte sequences.  Non-ASCII
+characters in ISO-2022 encodings should preferably inserted byte by
+byte, to avoid problems caused by the designation sequences before
+the actual characters.
 
 \\[hexl-quoted-insert] followed by another keystroke allows you to insert the 
key even if
 it isn't bound to self-insert.  An octal number can be supplied in place
 of another key to insert the octal number's ASCII representation.
 
-\\[hexl-insert-hex-char] will insert a given hexadecimal value (if it is 
between 0 and 0xFF)
-into the buffer at the current point.
+\\[hexl-insert-hex-char] will insert a given hexadecimal value
+into the buffer at the current address.
 
-\\[hexl-insert-octal-char] will insert a given octal value (if it is between 0 
and 0377)
-into the buffer at the current point.
+\\[hexl-insert-octal-char] will insert a given octal value
+into the buffer at the current address.
 
-\\[hexl-insert-decimal-char] will insert a given decimal value (if it is 
between 0 and 255)
-into the buffer at the current point.
+\\[hexl-insert-decimal-char] will insert a given decimal value
+into the buffer at the current address..
 
 \\[hexl-mode-exit] will exit `hexl-mode'.
 
@@ -332,26 +340,16 @@ You can use \\[hexl-find-file] to visit a file in Hexl 
mode.
   (unless (eq major-mode 'hexl-mode)
     (let ((modified (buffer-modified-p))
          (inhibit-read-only t)
-         (original-point (- (point) (point-min))))
-      (and (eobp) (not (bobp))
-          (setq original-point (1- original-point)))
+          (point-offset (bufferpos-to-filepos (point) 'exact)))
       ;; If `hexl-mode' is invoked with an argument the buffer is assumed to
       ;; be in hexl format.
       (when (memq arg '(1 nil))
-       ;; If the buffer's EOL type is -dos, we need to account for
-       ;; extra CR characters added when hexlify-buffer writes the
-       ;; buffer to a file.
-        ;; FIXME: This doesn't take into account multibyte coding systems.
-       (when (eq (coding-system-eol-type buffer-file-coding-system) 1)
-          (setq original-point (+ (count-lines (point-min) (point))
-                                 original-point))
-         (or (bolp) (setq original-point (1- original-point))))
         (hexlify-buffer)
         (restore-buffer-modified-p modified))
       (setq hexl-max-address
             (+ (* (/ (1- (buffer-size)) (hexl-line-displen)) 16) 15))
       (condition-case nil
-         (hexl-goto-address original-point)
+         (hexl-goto-address point-offset)
        (error nil)))
 
     (let ((max-address hexl-max-address))
@@ -440,7 +438,8 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
 (defun hexl-find-file (filename)
   "Edit file FILENAME as a binary file in hex dump format.
 Switch to a buffer visiting file FILENAME, creating one if none exists,
-and edit the file in `hexl-mode'."
+and edit the file in `hexl-mode'.  The buffer's coding-system will be
+no-conversion, unlike if you visit it normally and then invoke `hexl-mode'."
   (interactive
    (list
     (let ((completion-ignored-extensions nil))
@@ -478,17 +477,11 @@ With arg, don't unhexlify buffer."
   (if (or (eq arg 1) (not arg))
       (let ((modified (buffer-modified-p))
            (inhibit-read-only t)
-           (original-point (1+ (hexl-current-address))))
+            (point-offset (hexl-current-address)))
        (dehexlify-buffer)
        (remove-hook 'write-contents-functions #'hexl-save-buffer t)
        (restore-buffer-modified-p modified)
-       (goto-char original-point)
-       ;; Maybe adjust point for the removed CR characters.
-       (when (eq (coding-system-eol-type buffer-file-coding-system) 1)
-         (setq original-point (- original-point
-                                 (count-lines (point-min) (point))))
-         (or (bobp) (setq original-point (1+ original-point))))
-       (goto-char original-point)))
+       (goto-char (filepos-to-bufferpos point-offset 'exact))))
 
   (remove-hook 'change-major-mode-hook #'hexl-maybe-dehexlify-buffer t)
   (major-mode-restore))
@@ -499,11 +492,11 @@ Ask the user for confirmation."
   (if (y-or-n-p "Convert contents back to binary format? ")
       (let ((modified (buffer-modified-p))
            (inhibit-read-only t)
-           (original-point (1+ (hexl-current-address))))
+            (point-offset (hexl-current-address)))
        (dehexlify-buffer)
        (remove-hook 'write-contents-functions #'hexl-save-buffer t)
        (restore-buffer-modified-p modified)
-       (goto-char original-point))))
+       (goto-char (filepos-to-bufferpos point-offset 'exact)))))
 
 (defun hexl-current-address (&optional validate)
   "Return current hexl-address."
@@ -879,14 +872,27 @@ This discards the buffer's undo information."
   "Insert a possibly multibyte character CH NUM times.
 
 Non-ASCII characters are first encoded with `buffer-file-coding-system',
-and their encoded form is inserted byte by byte."
+and their encoded form is inserted byte by byte.  Note that if the
+hexl buffer was produced by `hexl-find-file', its coding-system
+is no-conversion.
+
+Inserting non-ASCII characters requires caution: the buffer's
+coding-system should correspond to the encoding on disk, and
+multibyte characters should be inserted with cursor on the first
+byte of a multibyte sequence whose length is identical to the
+length of the multibyte sequence to be inserted, otherwise this
+could produce invalid multibyte sequences.  Non-ASCII characters
+in ISO-2022 encodings should preferably inserted byte by byte, to
+avoid problems caused by the designation sequences before the
+actual characters."
   (let ((charset (char-charset ch))
        (coding (if (or (null buffer-file-coding-system)
                        ;; coding-system-type equals t means undecided.
                        (eq (coding-system-type buffer-file-coding-system) t))
                    (default-value 'buffer-file-coding-system)
                  buffer-file-coding-system)))
-    (cond ((and (> ch 0) (< ch 256))
+    (cond ((and (>= ch 0) (< ch 256)
+                (coding-system-get coding :ascii-compatible-p))
           (hexl-insert-char ch num))
          ((eq charset 'unknown)
           (error
@@ -924,7 +930,19 @@ and their encoded form is inserted byte by byte."
 Interactively, with a numeric argument, insert this character that many times.
 
 Non-ASCII characters are first encoded with `buffer-file-coding-system',
-and their encoded form is inserted byte by byte."
+and their encoded form is inserted byte by byte.  Note that if the
+hexl buffer was produced by `hexl-find-file', its coding-system
+is no-conversion.
+
+Inserting non-ASCII characters requires caution: the buffer's
+coding-system should correspond to the encoding on disk, and
+multibyte characters should be inserted with cursor on the first
+byte of a multibyte sequence whose length is identical to the
+length of the multibyte sequence to be inserted, otherwise this
+could produce invalid multibyte sequences.  Non-ASCII characters
+in ISO-2022 encodings should preferably inserted byte by byte, to
+avoid problems caused by the designation sequences before the
+actual characters."
   (interactive "p")
   (hexl-insert-multibyte-char last-command-event arg))
 
@@ -964,7 +982,21 @@ CH must be a unibyte character whose value is between 0 
and 255."
 ;; hex conversion
 
 (defun hexl-insert-hex-char (arg)
-  "Insert a character given by its hexadecimal code ARG times at point."
+  "Insert a character given by its hexadecimal code ARG times at point.
+
+Values above 0xFF are treated as multibyte characters, and first encoded
+using `buffer-file-coding-system'.  Note that if the hexl buffer was
+produced by `hexl-find-file', its coding-system is no-conversion.
+
+Inserting non-ASCII characters requires caution: the buffer's
+coding-system should correspond to the encoding on disk, and
+multibyte characters should be inserted with cursor on the first
+byte of a multibyte sequence whose length is identical to the
+length of the multibyte sequence to be inserted, otherwise this
+could produce invalid multibyte sequences.  Non-ASCII characters
+in ISO-2022 encodings should preferably inserted byte by byte, to
+avoid problems caused by the designation sequences before the
+actual characters."
   (interactive "p")
   (let ((num (hexl-hex-string-to-integer (read-string "Hex number: "))))
     (if (< num 0)
@@ -997,7 +1029,21 @@ Embedded whitespace, dashes, and periods in the string 
are ignored."
       (setq arg (- arg 1)))))
 
 (defun hexl-insert-decimal-char (arg)
-  "Insert a character given by its decimal code ARG times at point."
+  "Insert a character given by its decimal code ARG times at point.
+
+Values above 256 are treated as multibyte characters, and first encoded
+using `buffer-file-coding-system'.  Note that if the hexl buffer was
+produced by `hexl-find-file', its coding-system is no-conversion.
+
+Inserting non-ASCII characters requires caution: the buffer's
+coding-system should correspond to the encoding on disk, and
+multibyte characters should be inserted with cursor on the first
+byte of a multibyte sequence whose length is identical to the
+length of the multibyte sequence to be inserted, otherwise this
+could produce invalid multibyte sequences.  Non-ASCII characters
+in ISO-2022 encodings should preferably inserted byte by byte, to
+avoid problems caused by the designation sequences before the
+actual characters."
   (interactive "p")
   (let ((num (string-to-number (read-string "Decimal Number: "))))
     (if (< num 0)
@@ -1005,7 +1051,21 @@ Embedded whitespace, dashes, and periods in the string 
are ignored."
       (hexl-insert-multibyte-char num arg))))
 
 (defun hexl-insert-octal-char (arg)
-  "Insert a character given by its octal code ARG times at point."
+  "Insert a character given by its octal code ARG times at point.
+
+Values above \377 are treated as multibyte characters, and first encoded
+using `buffer-file-coding-system'.  Note that if the hexl buffer was
+produced by `hexl-find-file', its coding-system is no-conversion.
+
+Inserting non-ASCII characters requires caution: the buffer's
+coding-system should correspond to the encoding on disk, and
+multibyte characters should be inserted with cursor on the first
+byte of a multibyte sequence whose length is identical to the
+length of the multibyte sequence to be inserted, otherwise this
+could produce invalid multibyte sequences.  Non-ASCII characters
+in ISO-2022 encodings should preferably inserted byte by byte, to
+avoid problems caused by the designation sequences before the
+actual characters."
   (interactive "p")
   (let ((num (hexl-octal-string-to-integer (read-string "Octal Number: "))))
     (if (< num 0)
diff --git a/lisp/hl-line.el b/lisp/hl-line.el
index 82952e9..26cfcc3 100644
--- a/lisp/hl-line.el
+++ b/lisp/hl-line.el
@@ -125,6 +125,9 @@ This variable is expected to be made buffer-local by 
modes.")
 (defvar hl-line-overlay-buffer nil
   "Most recently visited buffer in which Hl-Line mode is enabled.")
 
+(defvar hl-line-overlay-priority -50
+  "Priority used on the overlay used by hl-line.")
+
 ;;;###autoload
 (define-minor-mode hl-line-mode
   "Toggle highlighting of the current line (Hl-Line mode).
@@ -152,7 +155,7 @@ line about point in the selected window only."
 
 (defun hl-line-make-overlay ()
   (let ((ol (make-overlay (point) (point))))
-    (overlay-put ol 'priority -50)           ;(bug#16192)
+    (overlay-put ol 'priority hl-line-overlay-priority) ;(bug#16192)
     (overlay-put ol 'face hl-line-face)
     ol))
 
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index b484dd7..9088f31 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -988,9 +988,7 @@ one window."
   (let ((buf (ibuffer-current-buffer t)))
     (bury-buffer (current-buffer))
     (if noselect
-       (let ((curwin (selected-window)))
-         (pop-to-buffer buf)
-         (select-window curwin))
+        (display-buffer buf)
       (switch-to-buffer-other-window buf))))
 
 (defun ibuffer-visit-buffer-other-window-noselect ()
@@ -1081,8 +1079,11 @@ a new window in the current frame, splitting vertically."
   ;; Make sure that redisplay is performed, otherwise there can be a
   ;; bad interaction with code in the window-scroll-functions hook
   (redisplay t)
-  (fit-window-to-buffer nil (when owin (/ (frame-height)
-                                         (length (window-list 
(selected-frame)))))))
+  (when (buffer-local-value 'ibuffer-auto-mode (window-buffer))
+    (fit-window-to-buffer
+     nil (and owin
+              (/ (frame-height)
+                (length (window-list (selected-frame))))))))
 
 (defun ibuffer-confirm-operation-on (operation names)
   "Display a buffer asking whether to perform OPERATION on NAMES."
diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 91bbb60..576fced 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -50,6 +50,8 @@
 ;;; Code:
 
 (require 'rfn-eshadow) ; rfn-eshadow-overlay
+(require 'simple) ; max-mini-window-lines
+(require 'cl-lib)
 
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
@@ -99,6 +101,10 @@ Otherwise this should be a list of the completion tables 
(e.g.,
   "Face used by Icomplete for highlighting first match."
   :version "24.4")
 
+(defface icomplete-selected-match '((t :inherit highlight))
+  "Face used by `icomplete-vertical-mode' for the selected candidate."
+  :version "24.4")
+
 ;;;_* User Customization variables
 (defcustom icomplete-prospects-height 2
   ;; We used to compute how many lines 100 characters would take in
@@ -109,7 +115,7 @@ Otherwise this should be a list of the completion tables 
(e.g.,
   :type 'integer
   :version "26.1")
 
-(defcustom icomplete-compute-delay .3
+(defcustom icomplete-compute-delay .15
   "Completions-computation stall, used only with large-number completions.
 See `icomplete-delay-completions-threshold'."
   :type 'number)
@@ -118,7 +124,7 @@ See `icomplete-delay-completions-threshold'."
   "Pending-completions number over which to apply `icomplete-compute-delay'."
   :type 'integer)
 
-(defcustom icomplete-max-delay-chars 3
+(defcustom icomplete-max-delay-chars 2
   "Maximum number of initial chars to apply `icomplete-compute-delay'."
   :type 'integer)
 
@@ -152,10 +158,6 @@ icompletion is occurring."
   "Initial input in the minibuffer when icomplete-mode was activated.
 Used to implement the option `icomplete-show-matches-on-no-input'.")
 
-(defun icomplete-pre-command-hook ()
- (let ((non-essential t))
-   (icomplete-tidy)))
-
 (defun icomplete-post-command-hook ()
   (let ((non-essential t)) ;E.g. don't prompt for password!
     (icomplete-exhibit)))
@@ -215,6 +217,29 @@ the default otherwise."
   ;; We're not at all interested in cycling here (bug#34077).
   (minibuffer-force-complete nil nil 'dont-cycle))
 
+;; Apropos `icomplete-scroll', we implement "scrolling icomplete"
+;; within classic icomplete, which is "rotating", by contrast.
+;;
+;; The two variables supporing this are
+;; `icomplete--scrolled-completions' and `icomplete--scrolled-past'.
+;; They come into play when:
+;;
+;; - The user invokes commands `icomplete-forward-completions' and
+;;   `icomplete-backward-completions', thus "manually" scrolling to a
+;;   given position;
+;;
+;; - The user re-filters a selection that had already been manually
+;;   scrolled.  The system attempts to keep the previous selection
+;;   stable in the face of the new filtering.  This is mostly done in
+;;   `icomplete--render-vertical'.
+;;
+(defvar icomplete-scroll nil
+  "If non-nil, scroll candidates list instead of rotating it.")
+(defvar icomplete--scrolled-completions nil
+  "If non-nil, tail of completions list manually scrolled to.")
+(defvar icomplete--scrolled-past nil
+  "If non-nil, reverse tail of completions scrolled past.")
+
 (defun icomplete-forward-completions ()
   "Step forward completions by one entry.
 Second entry becomes the first and can be selected with
@@ -223,10 +248,14 @@ Second entry becomes the first and can be selected with
   (let* ((beg (icomplete--field-beg))
          (end (icomplete--field-end))
          (comps (completion-all-sorted-completions beg end))
-        (last (last comps)))
-    (when comps
-      (setcdr last (cons (car comps) (cdr last)))
-      (completion--cache-all-sorted-completions beg end (cdr comps)))))
+         (last (last comps)))
+    (when (consp (cdr comps))
+      (cond (icomplete-scroll
+             (push (pop comps) icomplete--scrolled-past)
+             (setq icomplete--scrolled-completions comps))
+            (t
+             (setcdr (last comps) (cons (pop comps) (cdr last)))))
+      (completion--cache-all-sorted-completions beg end comps))))
 
 (defun icomplete-backward-completions ()
   "Step backward completions by one entry.
@@ -236,15 +265,19 @@ Last entry becomes the first and can be selected with
   (let* ((beg (icomplete--field-beg))
          (end (icomplete--field-end))
          (comps (completion-all-sorted-completions beg end))
-        (last-but-one (last comps 2))
-        (last (cdr last-but-one)))
-    (when (consp last)               ; At least two elements in comps
-      (setcdr last-but-one (cdr last))
-      (push (car last) comps)
-      (completion--cache-all-sorted-completions beg end comps))))
+        last-but-one)
+    (cond ((and icomplete-scroll icomplete--scrolled-past)
+           (push (pop icomplete--scrolled-past) comps)
+           (setq icomplete--scrolled-completions comps))
+          ((and (not icomplete-scroll)
+                (consp (cdr (setq last-but-one (last comps 2)))))
+           ;; At least two elements in comps
+           (push (car (cdr last-but-one)) comps)
+           (setcdr last-but-one (cdr (cdr last-but-one)))))
+    (completion--cache-all-sorted-completions beg end comps)))
+
+;;;_* Helpers for `fido-mode' (or `ido-mode' emulation)
 
-;;; Helpers for `fido-mode' (or `ido-mode' emulation)
-;;;
 (defun icomplete-fido-kill ()
   "Kill line or current completion, like `ido-mode'.
 If killing to the end of line make sense, call `kill-line',
@@ -298,7 +331,8 @@ require user confirmation."
                    (file-name-directory (icomplete--field-string))))
          (current (car completion-all-sorted-completions))
          (probe (and dir current
-                     (expand-file-name (directory-file-name current) dir))))
+                     (expand-file-name (directory-file-name current)
+                                       (substitute-env-vars dir)))))
     (cond ((and probe (file-directory-p probe) (not (string= current "./")))
            (icomplete-force-complete))
           (t
@@ -351,6 +385,7 @@ if that doesn't produce a completion match."
     (setq-local icomplete-tidy-shadowed-file-names t
                 icomplete-show-matches-on-no-input t
                 icomplete-hide-common-prefix nil
+                icomplete-scroll (not (null icomplete-vertical-mode))
                 completion-styles '(flex)
                 completion-flex-nospace nil
                 completion-category-defaults nil
@@ -449,9 +484,9 @@ Usually run by inclusion in `minibuffer-setup-hook'."
   (when (and icomplete-mode (icomplete-simple-completing-p))
     (setq-local icomplete--initial-input (icomplete--field-string))
     (setq-local completion-show-inline-help nil)
+    (setq icomplete--scrolled-completions nil)
     (use-local-map (make-composed-keymap icomplete-minibuffer-map
                                         (current-local-map)))
-    (add-hook 'pre-command-hook  #'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
     (run-hooks 'icomplete-minibuffer-setup-hook)))
 
@@ -465,7 +500,6 @@ Usually run by inclusion in `minibuffer-setup-hook'."
       (setq icomplete--in-region-buffer nil)
       (delete-overlay icomplete-overlay)
       (kill-local-variable 'completion-show-inline-help)
-      (remove-hook 'pre-command-hook  'icomplete-pre-command-hook  t)
       (remove-hook 'post-command-hook 'icomplete-post-command-hook t)
       (message nil)))
   (when (and completion-in-region-mode
@@ -477,12 +511,12 @@ Usually run by inclusion in `minibuffer-setup-hook'."
       (unless (memq icomplete-minibuffer-map (cdr tem))
        (setcdr tem (make-composed-keymap icomplete-minibuffer-map
                                          (cdr tem)))))
-    (add-hook 'pre-command-hook  'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook 'icomplete-post-command-hook nil t)))
 
 (defun icomplete--sorted-completions ()
   (or completion-all-sorted-completions
       (cl-loop
+       initially (setq icomplete--scrolled-past nil) ; Invalidate scrolled 
state
        with beg = (icomplete--field-beg)
        with end = (icomplete--field-end)
        with all = (completion-all-sorted-completions beg end)
@@ -593,18 +627,13 @@ resized depends on `resize-mini-windows'."
     (add-hook 'icomplete-minibuffer-setup-hook
               #'icomplete--vertical-minibuffer-setup)))
 
+(defalias 'fido-vertical-mode 'icomplete-vertical-mode)
+
 
 
 
 ;;;_* Completion
 
-;;;_ > icomplete-tidy ()
-(defun icomplete-tidy ()
-  "Remove completions display (if any) prior to new user input.
-Should be run in on the minibuffer `pre-command-hook'.
-See `icomplete-mode' and `minibuffer-setup-hook'."
-  (delete-overlay icomplete-overlay))
-
 ;;;_ > icomplete-exhibit ()
 (defun icomplete-exhibit ()
   "Insert Icomplete completions display.
@@ -659,13 +688,126 @@ See `icomplete-mode' and `minibuffer-setup-hook'."
                  deactivate-mark)
             ;; Do nothing if while-no-input was aborted.
             (when (stringp text)
-              (move-overlay icomplete-overlay (point) (point) (current-buffer))
+              (move-overlay icomplete-overlay (point-min) (point) 
(current-buffer))
               ;; The current C cursor code doesn't know to use the overlay's
               ;; marker's stickiness to figure out whether to place the cursor
               ;; before or after the string, so let's spoon-feed it the pos.
               (put-text-property 0 1 'cursor t text)
+              (overlay-put
+               icomplete-overlay 'before-string
+               (and icomplete-scroll
+                    (let ((past (length icomplete--scrolled-past)))
+                      (format
+                       "%s/%s "
+                       (1+ past)
+                       (+ past
+                          (safe-length completion-all-sorted-completions))))))
               (overlay-put icomplete-overlay 'after-string text))))))))
 
+(defun icomplete--affixate (md prospects)
+  "Affixate PROSPECTS given completion metadata MD.
+Return a list of (COMP PREFIX SUFFIX)."
+  (let ((aff-fun (or (completion-metadata-get md 'affixation-function)
+                     (plist-get completion-extra-properties 
:affixation-function)))
+        (ann-fun (or (completion-metadata-get md 'annotation-function)
+                     (plist-get completion-extra-properties 
:annotation-function))))
+    (cond (aff-fun
+           (funcall aff-fun prospects))
+          (ann-fun
+           (mapcar
+            (lambda (comp)
+              (let ((suffix (or (funcall ann-fun comp) "")))
+                (list comp ""
+                      ;; The default completion UI adds the
+                      ;; `completions-annotations' face if no
+                      ;; other faces are present.
+                      (if (text-property-not-all 0 (length suffix) 'face nil 
suffix)
+                          suffix
+                        (propertize suffix 'face 'completions-annotations)))))
+            prospects))
+          (prospects))))
+
+(cl-defun icomplete--render-vertical (comps md &aux scroll-above scroll-below)
+  ;; Welcome to loopapalooza!
+  ;;
+  ;; First, be mindful of `icomplete-scroll' and manual scrolls.  If
+  ;; `icomplete--scrolled-completions' and `icomplete--scrolled-past'
+  ;; are:
+  ;;
+  ;; - both nil, there is no manual scroll;
+  ;; - both non-nil, there is a healthy manual scroll the doesn't need
+  ;;   to be readjusted (user just moved around the minibuffer, for
+  ;;   example)l
+  ;; - non-nil and nil, respectively, a refiltering took place and we
+  ;;   need attempt to readjust them to the new filtered `comps'.
+  (when (and icomplete-scroll
+             icomplete--scrolled-completions
+             (null icomplete--scrolled-past))
+    (cl-loop with preds
+             for (comp . rest) on comps
+             when (equal comp (car icomplete--scrolled-completions))
+             do
+             (setq icomplete--scrolled-past preds
+                   comps (cons comp rest))
+             (completion--cache-all-sorted-completions
+              (icomplete--field-beg)
+              (icomplete--field-end)
+              comps)
+             and return nil
+             do (push comp preds)
+             finally (setq icomplete--scrolled-completions nil)))
+  ;; Then, in this pretty ugly loop, collect completions to display
+  ;; above and below the selected one, considering scrolling
+  ;; positions.
+  (cl-loop with preds = icomplete--scrolled-past
+           with succs = (cdr comps)
+           with max-lines = (1- (min
+                                 icomplete-prospects-height
+                                 (truncate (max-mini-window-lines) 1)))
+           with max-above = (- max-lines
+                               1
+                               (cl-loop for (_ . r) on comps
+                                        repeat (truncate max-lines 2)
+                                        while (listp r)
+                                        count 1))
+           repeat max-lines
+           for neighbour = nil
+           if (and preds (> max-above 0)) do
+           (push (setq neighbour (pop preds)) scroll-above)
+           (cl-decf max-above)
+           else if (consp succs) collect
+           (setq neighbour (pop succs)) into scroll-below-aux
+           while neighbour
+           finally (setq scroll-below scroll-below-aux))
+  ;; Now figure out spacing and layout
+  ;;
+  (cl-loop
+   with selected = (substring (car comps))
+   initially (add-face-text-property 0 (length selected)
+                                     'icomplete-selected-match 'append 
selected)
+   with torender = (nconc scroll-above (list selected) scroll-below)
+   with triplets = (icomplete--affixate md torender)
+   initially (when (eq triplets torender)
+               (cl-return-from icomplete--render-vertical
+                 (concat
+                  " \n"
+                  (mapconcat #'identity torender icomplete-separator))))
+   for (comp prefix) in triplets
+   maximizing (length prefix) into max-prefix-len
+   maximizing (length comp) into max-comp-len
+   finally return
+   ;; Finally, render
+   ;;
+   (concat
+    " \n"
+    (cl-loop for (comp prefix suffix) in triplets
+             concat prefix
+             concat (make-string (- max-prefix-len (length prefix)) ? )
+             concat comp
+             concat (make-string (- max-comp-len (length comp)) ? )
+             concat suffix
+             concat icomplete-separator))))
+
 ;;;_ > icomplete-completions (name candidates predicate require-match)
 (defun icomplete-completions (name candidates predicate require-match)
   "Identify prospective candidates for minibuffer completion.
@@ -703,128 +845,131 @@ matches exist."
             predicate))
         (md (completion--field-metadata (icomplete--field-beg)))
         (comps (icomplete--sorted-completions))
-         (last (if (consp comps) (last comps)))
-         (base-size (cdr last))
          (open-bracket (if require-match "(" "["))
          (close-bracket (if require-match ")" "]")))
     ;; `concat'/`mapconcat' is the slow part.
     (if (not (consp comps))
        (progn ;;(debug (format "Candidates=%S field=%S" candidates name))
          (format " %sNo matches%s" open-bracket close-bracket))
-      (if last (setcdr last nil))
-      (let* ((most-try
-              (if (and base-size (> base-size 0))
-                  (completion-try-completion
-                   name candidates predicate (length name) md)
-                ;; If the `comps' are 0-based, the result should be
-                ;; the same with `comps'.
-                (completion-try-completion
-                 name comps nil (length name) md)))
-            (most (if (consp most-try) (car most-try)
-                     (if most-try (car comps) "")))
-             ;; Compare name and most, so we can determine if name is
-             ;; a prefix of most, or something else.
-            (compare (compare-strings name nil nil
-                                      most nil nil completion-ignore-case))
-            (ellipsis (if (char-displayable-p ?…) "…" "..."))
-            (determ (unless (or (eq t compare) (eq t most-try)
-                                (= (setq compare (1- (abs compare)))
-                                   (length most)))
-                      (concat open-bracket
-                              (cond
-                               ((= compare (length name))
-                                 ;; Typical case: name is a prefix.
-                                (substring most compare))
-                                ;; Don't bother truncating if it doesn't gain
-                                ;; us at least 2 columns.
-                               ((< compare (+ 2 (string-width ellipsis))) most)
-                               (t (concat ellipsis (substring most compare))))
-                              close-bracket)))
-            ;;"-prospects" - more than one candidate
-            (prospects-len (+ (string-width
-                               (or determ (concat open-bracket close-bracket)))
-                              (string-width icomplete-separator)
-                              (+ 2 (string-width ellipsis)) ;; take {…} into 
account
-                              (string-width (buffer-string))))
-             (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
-             ;; Find the common prefix among `comps'.
-             ;; We can't use the optimization below because its assumptions
-             ;; aren't always true, e.g. when completion-cycling (bug#10850):
-             ;; (if (eq t (compare-strings (car comps) nil (length most)
-             ;;                         most nil nil completion-ignore-case))
-             ;;     ;; Common case.
-             ;;     (length most)
-             ;; Else, use try-completion.
-            (prefix (when icomplete-hide-common-prefix
-                      (try-completion "" comps)))
-             (prefix-len
-             (and (stringp prefix)
-                   ;; Only hide the prefix if the corresponding info
-                   ;; is already displayed via `most'.
-                   (string-prefix-p prefix most t)
-                   (length prefix))) ;;)
-            prospects comp limit)
-       (if (or (eq most-try t) (not (consp (cdr comps))))
-           (setq prospects nil)
-         (when (member name comps)
-           ;; NAME is complete but not unique.  This scenario poses
-           ;; following UI issues:
-           ;;
-           ;; - When `icomplete-hide-common-prefix' is non-nil, NAME
-           ;;   is stripped empty.  This would make the entry
-           ;;   inconspicuous.
-           ;;
-           ;; - Due to sorting of completions, NAME may not be the
-           ;;   first of the prospects and could be hidden deep in
-           ;;   the displayed string.
-           ;;
-           ;; - Because of `icomplete-prospects-height' , NAME may
-           ;;   not even be displayed to the user.
-           ;;
-           ;; To circumvent all the above problems, provide a visual
-           ;; cue to the user via an "empty string" in the try
-           ;; completion field.
-           (setq determ (concat open-bracket "" close-bracket)))
-         ;; Compute prospects for display.
-         (while (and comps (not limit))
-           (setq comp
-                 (if prefix-len (substring (car comps) prefix-len) (car comps))
-                 comps (cdr comps))
-           (setq prospects-len
-                  (+ (string-width comp)
-                    (string-width icomplete-separator)
-                    prospects-len))
-           (if (< prospects-len prospects-max)
-               (push comp prospects)
-             (setq limit t))))
-       (setq prospects (nreverse prospects))
-       ;; Decorate first of the prospects.
-       (when prospects
-         (let ((first (copy-sequence (pop prospects))))
-           (put-text-property 0 (length first)
-                              'face 'icomplete-first-match first)
-           (push first prospects)))
-        ;; Restore the base-size info, since completion-all-sorted-completions
-        ;; is cached.
-        (if last (setcdr last base-size))
-       (if prospects
-           (concat determ
-                   (if icomplete-vertical-mode " \n" "{")
-                   (mapconcat 'identity prospects (if icomplete-vertical-mode
-                                                       "\n"
-                                                       icomplete-separator))
-                   (unless icomplete-vertical-mode
-                      (concat (and limit (concat icomplete-separator ellipsis))
-                              "}")))
-         (concat determ " [Matched]"))))))
-
-;;; Iswitchb compatibility
+      (if icomplete-vertical-mode
+         (icomplete--render-vertical comps md)
+        (let* ((last (if (consp comps) (last comps)))
+               ;; Save the "base size" encoded in `comps' then
+               ;; removing making `comps' a proper list.
+               (base-size (prog1 (cdr last)
+                            (if last (setcdr last nil))))
+               (most-try
+                ;; icomplete-hide-common-prefix logic is used
+                ;; unconditionally when there is single match.
+                (when (or icomplete-hide-common-prefix (not (cdr comps)))
+                  (if (and base-size (> base-size 0))
+                      (completion-try-completion
+                       name candidates predicate (length name) md)
+                    ;; If the `comps' are 0-based, the result should be
+                    ;; the same with `comps'.
+                    (completion-try-completion
+                     name comps nil (length name) md))))
+               (most (if (consp most-try) (car most-try)
+                       (if most-try (car comps) "")))
+               ;; Compare name and most, so we can determine if name is
+               ;; a prefix of most, or something else.
+               (compare (compare-strings name nil nil
+                                         most nil nil completion-ignore-case))
+               (ellipsis (if (char-displayable-p ?…) "…" "..."))
+               (determ (unless (or (eq t compare) (eq t most-try)
+                                   (= (setq compare (1- (abs compare)))
+                                      (length most)))
+                         (concat open-bracket
+                                 (cond
+                                  ((= compare (length name))
+                                   ;; Typical case: name is a prefix.
+                                   (substring most compare))
+                                  ;; Don't bother truncating if it doesn't gain
+                                  ;; us at least 2 columns.
+                                  ((< compare (+ 2 (string-width ellipsis))) 
most)
+                                  (t (concat ellipsis (substring most 
compare))))
+                                 close-bracket)))
+               ;;"-prospects" - more than one candidate
+               (prospects-len (+ (string-width
+                                  (or determ (concat open-bracket 
close-bracket)))
+                                 (string-width icomplete-separator)
+                                 (+ 2 (string-width ellipsis)) ;; take {…} 
into account
+                                 (string-width (buffer-string))))
+               (prospects-max
+                ;; Max total length to use, including the minibuffer content.
+                (* (+ icomplete-prospects-height
+                      ;; If the minibuffer content already uses up more than
+                      ;; one line, increase the allowable space accordingly.
+                      (/ prospects-len (window-width)))
+                   (window-width)))
+               ;; Find the common prefix among `comps'.
+               ;; We can't use the optimization below because its assumptions
+               ;; aren't always true, e.g. when completion-cycling (bug#10850):
+               ;; (if (eq t (compare-strings (car comps) nil (length most)
+               ;;                        most nil nil completion-ignore-case))
+               ;;     ;; Common case.
+               ;;     (length most)
+               ;; Else, use try-completion.
+               (prefix (when icomplete-hide-common-prefix
+                         (try-completion "" comps)))
+               (prefix-len
+                (and (stringp prefix)
+                     ;; Only hide the prefix if the corresponding info
+                     ;; is already displayed via `most'.
+                     (string-prefix-p prefix most t)
+                     (length prefix))) ;;)
+               prospects comp limit)
+          (prog1
+              (if (or (eq most-try t) (and (not icomplete-scroll)
+                                           (not (consp (cdr comps)))))
+                  (concat determ " [Matched]")
+                (when (member name comps)
+                  ;; NAME is complete but not unique.  This scenario poses
+                  ;; following UI issues:
+                  ;;
+                  ;; - When `icomplete-hide-common-prefix' is non-nil, NAME
+                  ;;   is stripped empty.  This would make the entry
+                  ;;   inconspicuous.
+                  ;;
+                  ;; - Due to sorting of completions, NAME may not be the
+                  ;;   first of the prospects and could be hidden deep in
+                  ;;   the displayed string.
+                  ;;
+                  ;; - Because of `icomplete-prospects-height' , NAME may
+                  ;;   not even be displayed to the user.
+                  ;;
+                  ;; To circumvent all the above problems, provide a visual
+                  ;; cue to the user via an "empty string" in the try
+                  ;; completion field.
+                  (setq determ (concat open-bracket "" close-bracket)))
+                (while (and comps (not limit))
+                  (setq comp
+                        (if prefix-len (substring (car comps) prefix-len) (car 
comps))
+                        comps (cdr comps))
+                  (setq prospects-len
+                        (+ (string-width comp)
+                           (string-width icomplete-separator)
+                           prospects-len))
+                  (if (< prospects-len prospects-max)
+                      (push comp prospects)
+                    (setq limit t)))
+                (setq prospects (nreverse prospects))
+                ;; Decorate first of the prospects.
+                (when prospects
+                  (let ((first (copy-sequence (pop prospects))))
+                    (put-text-property 0 (length first)
+                                       'face 'icomplete-first-match first)
+                    (push first prospects)))
+                (concat determ
+                        "{"
+                        (mapconcat 'identity prospects icomplete-separator)
+                        (concat (and limit (concat icomplete-separator 
ellipsis))
+                                "}")))
+            ;; Restore the base-size info, since 
completion-all-sorted-completions
+            ;; is cached.
+            (if last (setcdr last base-size))))))))
+
+;;;_* Iswitchb compatibility
 
 ;; We moved Iswitchb to `obsolete' in 24.4, but autoloads in files in
 ;; `obsolete' aren't obeyed (since that would encourage people to keep using
@@ -839,7 +984,7 @@ matches exist."
 
 (provide 'icomplete)
 
-;;_* Local emacs vars.
+;;;_* Local emacs vars.
 ;;Local variables:
 ;;allout-layout: (-2 :)
 ;;End:
diff --git a/lisp/image.el b/lisp/image.el
index 610d020..ee15294 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -839,6 +839,9 @@ number, play until that number of seconds has elapsed."
          (cancel-timer timer))
       (plist-put (cdr image) :animate-buffer (current-buffer))
       (plist-put (cdr image) :animate-tardiness 0)
+      ;; Stash the data about the animation here so that we don't
+      ;; trigger image recomputation unnecessarily later.
+      (plist-put (cdr image) :animate-multi-frame-data animation)
       (run-with-timer 0.2 nil #'image-animate-timeout
                      image (or index 0) (car animation)
                      0 limit (+ (float-time) 0.2)))))
@@ -869,9 +872,10 @@ Frames are indexed from 0.  Optional argument NOCHECK 
non-nil means
 do not check N is within the range of frames present in the image."
   (unless nocheck
     (if (< n 0) (setq n 0)
-      (setq n (min n (1- (car (image-multi-frame-p image)))))))
+      (setq n (min n (1- (car (plist-get (cdr image)
+                                         :animate-multi-frame-data)))))))
   (plist-put (cdr image) :index n)
-  (force-window-update))
+  (force-window-update (plist-get (cdr image) :animate-buffer)))
 
 (defun image-animate-get-speed (image)
   "Return the speed factor for animating IMAGE."
@@ -917,11 +921,11 @@ for the animation speed.  A negative value means to 
animate in reverse."
     (image-show-frame image n t)
     (let* ((speed (image-animate-get-speed image))
           (time (current-time))
-          (animation (image-multi-frame-p image))
           (time-to-load-image (time-since time))
-          (stated-delay-time (/ (or (cdr animation)
-                                    image-default-frame-delay)
-                                (float (abs speed))))
+          (stated-delay-time
+            (/ (or (cdr (plist-get (cdr image) :animate-multi-frame-data))
+                  image-default-frame-delay)
+              (float (abs speed))))
           ;; Subtract off the time we took to load the image from the
           ;; stated delay time.
           (delay (max (float-time (time-subtract stated-delay-time
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 7fc57c1..2024bb1 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -463,8 +463,8 @@ Non-nil arguments are in recursive calls."
                      ((imenu--subalist-p item)
                       (imenu--create-keymap (car item) (cdr item) cmd))
                      (t
-                      `(lambda () (interactive)
-                         ,(if cmd `(,cmd ',item) (list 'quote item)))))))
+                      (lambda () (interactive)
+                        (if cmd (funcall cmd item) item))))))
               alist)))
 
 (defun imenu--in-alist (str alist)
diff --git a/lisp/indent.el b/lisp/indent.el
index 285b8e2..a33d962 100644
--- a/lisp/indent.el
+++ b/lisp/indent.el
@@ -39,8 +39,8 @@
 (defvar indent-line-function 'indent-relative
   "Function to indent the current line.
 This function will be called with no arguments.
-If it is called somewhere where auto-indentation cannot be done
-\(e.g. inside a string), the function should simply return `noindent'.
+If it is called somewhere where it cannot auto-indent, the function
+should return `noindent' to signal that it didn't.
 Setting this function is all you need to make TAB indent appropriately.
 Don't rebind TAB unless you really need to.")
 
diff --git a/lisp/info-xref.el b/lisp/info-xref.el
index be1928d..538a017 100644
--- a/lisp/info-xref.el
+++ b/lisp/info-xref.el
@@ -95,7 +95,7 @@ about local variables or possible weirdness in a major mode.
 `lm-with-file' does a similar thing, but it sets
 `emacs-lisp-mode' which is not wanted here."
 
-  (declare (debug t) (indent 1))
+  (declare (debug (form def-body)) (indent 1))
   `(let* ((info-xref-with-file--filename ,filename)
           (info-xref-with-file--body     (lambda () ,@body))
           (info-xref-with-file--existing
diff --git a/lisp/info.el b/lisp/info.el
index 82f0eb3..cdf339f 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -1855,7 +1855,8 @@ See `completing-read' for a description of arguments and 
usage."
          (lambda (string pred action)
            (complete-with-action
             action
-            (Info-build-node-completions (Info-find-file file1 nil t))
+            (when-let ((file2 (Info-find-file file1 'noerror t)))
+              (Info-build-node-completions file2))
             string pred))
         nodename predicate code))))
    ;; Otherwise use Info-read-node-completion-table.
@@ -1881,10 +1882,17 @@ the Top node in FILENAME."
       (or (cdr (assoc filename Info-file-completions))
          (with-temp-buffer
            (Info-mode)
-           (Info-goto-node (format "(%s)Top" filename))
-           (Info-build-node-completions-1)
-           (push (cons filename Info-current-file-completions) 
Info-file-completions)
-           Info-current-file-completions))
+            (condition-case nil
+               (Info-goto-node (format "(%s)Top" filename))
+              ;; `Info-goto-node' signals a `user-error' when there
+              ;; are no nodes in the file in question (for instance,
+              ;; if it's not actually an Info file).
+              (user-error nil)
+              (:success
+              (Info-build-node-completions-1)
+              (push (cons filename Info-current-file-completions)
+                     Info-file-completions)
+              Info-current-file-completions))))
     (or Info-current-file-completions
        (Info-build-node-completions-1))))
 
@@ -2140,8 +2148,10 @@ If DIRECTION is `backward', search in the reverse 
direction."
     (goto-char (if isearch-forward (point-min) (point-max)))))
 
 (defun Info-isearch-push-state ()
-  `(lambda (cmd)
-     (Info-isearch-pop-state cmd ',Info-current-file ',Info-current-node)))
+  (let ((file Info-current-file)
+        (node Info-current-node))
+    (lambda (cmd)
+      (Info-isearch-pop-state cmd file node))))
 
 (defun Info-isearch-pop-state (_cmd file node)
   (or (and (equal Info-current-file file)
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index b99db46..55accf5 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2963,18 +2963,22 @@ STR should be a unibyte string."
    str " "))
 
 (defun encode-coding-char (char coding-system &optional charset)
-  "Encode CHAR by CODING-SYSTEM and return the resulting string.
+  "Encode CHAR by CODING-SYSTEM and return the resulting string of bytes.
 If CODING-SYSTEM can't safely encode CHAR, return nil.
 The 3rd optional argument CHARSET, if non-nil, is a charset preferred
 on encoding."
   (let* ((str1 (string char))
         (str2 (string char char))
         (found (find-coding-systems-string str1))
-       enc1 enc2 i1 i2)
-    (if (eq (car-safe found) 'undecided) ;Aka (not (multibyte-string-p str1))
-        ;; `char' is ASCII.
+         (bom-p (coding-system-get coding-system :bom))
+        enc1 enc2 i0 i1 i2)
+    ;; If CHAR is ASCII and CODING-SYSTEM doesn't prepend a BOM, just
+    ;; encode CHAR.
+    (if (and (eq (car-safe found) 'undecided)
+             (null bom-p))
        (encode-coding-string str1 coding-system)
-      (when (memq (coding-system-base coding-system) found)
+      (when (or (eq (car-safe found) 'undecided)
+                (memq (coding-system-base coding-system) found))
        ;; We must find the encoded string of CHAR.  But, just encoding
        ;; CHAR will put extra control sequences (usually to designate
        ;; ASCII charset) at the tail if type of CODING is ISO 2022.
@@ -2995,7 +2999,19 @@ on encoding."
        ;; Now (substring enc1 i1) and (substring enc2 i2) are the same,
        ;; and they are the extra control sequences at the tail to
        ;; exclude.
-       (substring enc2 0 i2)))))
+
+        ;; We also need to exclude the leading 2 or 3 bytes if they
+        ;; come from a BOM.
+        (setq i0
+              (if bom-p
+                  (cond
+                   ((eq (coding-system-type coding-system) 'utf-8)
+                    3)
+                   ((eq (coding-system-type coding-system) 'utf-16)
+                    2)
+                   (t 0))
+                0))
+       (substring enc2 i0 i2)))))
 
 ;; Backwards compatibility.  These might be better with :init-value t,
 ;; but that breaks loadup.
@@ -3088,35 +3104,12 @@ on encoding."
               (list name (concat (if char (list char) " ") "\t") "")))
           names))
 
-(defun mule--ucs-names-group (names)
-  (let* ((codes-and-names
-          (mapcar (lambda (name) (cons (gethash name ucs-names) name)) names))
-         (grouped
-          (seq-group-by
-           (lambda (code-name)
-             (let ((script (aref char-script-table (car code-name))))
-               (if script (symbol-name script) "ungrouped")))
-           codes-and-names))
-         names-with-header header)
-    (dolist (group (sort grouped (lambda (a b) (string< (car a) (car b)))))
-      (setq header t)
-      (dolist (code-name (cdr group))
-        (push (list
-               (cdr code-name)
-               (concat
-                (if header
-                    (progn
-                      (setq header nil)
-                      (concat "\n" (propertize
-                                    (format "* %s\n" (car group))
-                                    'face 'header-line)))
-                  "")
-                ;; prefix
-                (if (car code-name) (format "%c" (car code-name)) " ") "\t")
-               ;; suffix
-               "")
-              names-with-header)))
-    (nreverse names-with-header)))
+(defun mule--ucs-names-group (name transform)
+  (if transform
+      name
+    (let* ((char (gethash name ucs-names))
+           (script (and char (aref char-script-table char))))
+      (if script (symbol-name script) "ungrouped"))))
 
 (defun char-from-name (string &optional ignore-case)
   "Return a character as a number from its Unicode name STRING.
@@ -3148,14 +3141,6 @@ Defines the sorting order either by character names or 
their codepoints."
   :group 'mule
   :version "28.1")
 
-(defcustom read-char-by-name-group nil
-  "How to group characters for `read-char-by-name' completion.
-When t, split characters to sections of Unicode blocks
-sorted alphabetically."
-  :type 'boolean
-  :group 'mule
-  :version "28.1")
-
 (defun read-char-by-name (prompt)
   "Read a character by its Unicode name or hex number string.
 Display PROMPT and read a string that represents a character by its
@@ -3169,8 +3154,9 @@ preceded by an asterisk `*' and use completion, it will 
show all
 the characters whose names include that substring, not necessarily
 at the beginning of the name.
 
-The options `read-char-by-name-sort' and `read-char-by-name-group'
-define the sorting order of completion characters and how to group them.
+The options `read-char-by-name-sort', `completions-group', and
+`completions-group-sort' define the sorting order of completion characters,
+whether to group them, and how to sort groups.
 
 Accept a name like \"CIRCULATION FUNCTION\", a hexadecimal
 number like \"2A10\", or a number in hash notation (e.g.,
@@ -3188,11 +3174,12 @@ as names, not numbers."
                 `(metadata
                   (display-sort-function
                    . ,(when (eq read-char-by-name-sort 'code)
-                         #'mule--ucs-names-sort-by-code))
+                        #'mule--ucs-names-sort-by-code))
                   (affixation-function
-                   . ,(if read-char-by-name-group
-                           #'mule--ucs-names-group
-                         #'mule--ucs-names-affixation))
+                   . ,#'mule--ucs-names-affixation)
+                  (group-function
+                   . ,(when completions-group
+                        #'mule--ucs-names-group))
                   (category . unicode-name))
               (complete-with-action action (ucs-names) string pred)))))
         (char
diff --git a/lisp/international/quail.el b/lisp/international/quail.el
index fff06de..5d13115 100644
--- a/lisp/international/quail.el
+++ b/lisp/international/quail.el
@@ -1368,6 +1368,30 @@ If STR has `advice' text property, append the following 
special event:
       (delete-region (overlay-start quail-overlay)
                     (overlay-end quail-overlay))))
 
+;; Quail puts keys back in `unread-command-events' to be re-read
+;; again, but these keys have already been recorded in recent-keys and
+;; in the keyboard macro, if one is being defined, which means that
+;; recording them again creates duplicates.  This function is a
+;; wrapper around adding input events to `unread-command-events', but
+;; it makes sure these events will not be recorded a second time.
+(defun quail-add-unread-command-events (key &optional reset)
+  "Add KEY to `unread-command-events', but avoid recording it a second time.
+If KEY is a character, it is prepended to `unread-command-events' as
+a cons cell of the form (no-record . KEY).
+If KEY is a vector of events, the events in the vector are prepended
+to `unread-command-events', after converting each event to a cons cell
+of the form (no-record . EVENT).
+If RESET is non-nil, the events in `unread-command-events' are first
+discarded, i.e. in this case KEY will end up being the only key
+in `unread-command-events'."
+  (if reset (setq unread-command-events nil))
+  (setq unread-command-events
+        (if (characterp key)
+            (cons (cons 'no-record key) unread-command-events)
+          (append (mapcan (lambda (e) (list (cons 'no-record e)))
+                          (append key nil))
+                  unread-command-events))))
+
 (defun quail-start-translation (key)
   "Start translation of the typed character KEY by the current Quail package.
 Return the input string."
@@ -1385,13 +1409,11 @@ Return the input string."
             ;; (generated-events nil)     ;FIXME: What is this?
             (input-method-function nil)
             (modified-p (buffer-modified-p))
-            last-command-event last-command this-command inhibit-record)
+            last-command-event last-command this-command)
        (setq quail-current-key ""
              quail-current-str ""
              quail-translating t)
-       (if key
-           (setq unread-command-events (cons key unread-command-events)
-                  inhibit-record t))
+       (if key (quail-add-unread-command-events key))
        (while quail-translating
          (set-buffer-modified-p modified-p)
          (quail-show-guidance)
@@ -1400,13 +1422,8 @@ Return the input string."
                                     (or input-method-previous-message "")
                                     quail-current-str
                                     quail-guidance-str)))
-                 ;; We inhibit record_char only for the first key,
-                 ;; because it was already recorded before read_char
-                 ;; called quail-input-method.
-                 (inhibit--record-char inhibit-record)
                 (keyseq (read-key-sequence prompt nil nil t))
                 (cmd (lookup-key (quail-translation-keymap) keyseq)))
-            (setq inhibit-record nil)
            (if (if key
                    (and (commandp cmd) (not (eq cmd 'quail-other-command)))
                  (eq cmd 'quail-self-insert-command))
@@ -1420,9 +1437,7 @@ Return the input string."
                    (quail-error (message "%s" (cdr err)) (beep))))
              ;; KEYSEQ is not defined in the translation keymap.
              ;; Let's return the event(s) to the caller.
-             (setq unread-command-events
-                   (append (this-single-command-raw-keys)
-                            unread-command-events))
+             (quail-add-unread-command-events (this-single-command-raw-keys))
              (setq quail-translating nil))))
        (quail-delete-region)
        quail-current-str)
@@ -1450,15 +1465,13 @@ Return the input string."
             ;; (generated-events nil)     ;FIXME: What is this?
             (input-method-function nil)
             (modified-p (buffer-modified-p))
-            last-command-event last-command this-command inhibit-record)
+            last-command-event last-command this-command)
        (setq quail-current-key ""
              quail-current-str ""
              quail-translating t
              quail-converting t
              quail-conversion-str "")
-       (if key
-           (setq unread-command-events (cons key unread-command-events)
-                  inhibit-record t))
+       (if key (quail-add-unread-command-events key))
        (while quail-converting
          (set-buffer-modified-p modified-p)
          (or quail-translating
@@ -1474,13 +1487,8 @@ Return the input string."
                                     quail-conversion-str
                                     quail-current-str
                                     quail-guidance-str)))
-                 ;; We inhibit record_char only for the first key,
-                 ;; because it was already recorded before read_char
-                 ;; called quail-input-method.
-                 (inhibit--record-char inhibit-record)
                 (keyseq (read-key-sequence prompt nil nil t))
                 (cmd (lookup-key (quail-conversion-keymap) keyseq)))
-            (setq inhibit-record nil)
            (if (if key (commandp cmd) (eq cmd 'quail-self-insert-command))
                (progn
                  (setq last-command-event (aref keyseq (1- (length keyseq)))
@@ -1503,9 +1511,7 @@ Return the input string."
                            (setq quail-converting nil)))))
              ;; KEYSEQ is not defined in the conversion keymap.
              ;; Let's return the event(s) to the caller.
-             (setq unread-command-events
-                   (append (this-single-command-raw-keys)
-                            unread-command-events))
+             (quail-add-unread-command-events (this-single-command-raw-keys))
              (setq quail-converting nil))))
        (setq quail-translating nil)
        (if (overlay-start quail-conv-overlay)
@@ -1551,9 +1557,8 @@ with more keys."
               (or input-method-exit-on-first-char
                   (while (> len control-flag)
                     (setq len (1- len))
-                    (setq unread-command-events
-                          (cons (aref quail-current-key len)
-                                unread-command-events))))))
+                    (quail-add-unread-command-events
+                     (aref quail-current-key len))))))
            ((null control-flag)
             (unless quail-current-str
               (setq quail-current-str
@@ -1799,8 +1804,7 @@ sequence counting from the head."
          (setcar indices (1+ (car indices)))
          (quail-update-current-translations)
          (quail-update-translation nil)))
-    (setq unread-command-events
-         (cons last-command-event unread-command-events))
+    (quail-add-unread-command-events last-command-event)
     (quail-terminate-translation)))
 
 (defun quail-prev-translation ()
@@ -1814,8 +1818,7 @@ sequence counting from the head."
          (setcar indices (1- (car indices)))
          (quail-update-current-translations)
          (quail-update-translation nil)))
-    (setq unread-command-events
-         (cons last-command-event unread-command-events))
+    (quail-add-unread-command-events last-command-event)
     (quail-terminate-translation)))
 
 (defun quail-next-translation-block ()
@@ -1830,8 +1833,7 @@ sequence counting from the head."
          (setcar indices (+ (nth 2 indices) offset))
          (quail-update-current-translations)
          (quail-update-translation nil)))
-    (setq unread-command-events
-         (cons last-command-event unread-command-events))
+    (quail-add-unread-command-events last-command-event)
     (quail-terminate-translation)))
 
 (defun quail-prev-translation-block ()
@@ -1850,8 +1852,7 @@ sequence counting from the head."
                (setcar indices (+ (nth 1 indices) offset))
                (quail-update-current-translations)))
          (quail-update-translation nil)))
-    (setq unread-command-events
-         (cons last-command-event unread-command-events))
+    (quail-add-unread-command-events last-command-event)
     (quail-terminate-translation)))
 
 (defun quail-abort-translation ()
@@ -2006,8 +2007,8 @@ Remaining args are for FUNC."
     (sit-for 1000000)
     (delete-region point-max (point-max))
     (when quit-flag
-      (setq quit-flag nil
-           unread-command-events '(7)))))
+      (setq quit-flag nil)
+      (quail-add-unread-command-events 7 t))))
 
 (defun quail-show-guidance ()
   "Display a guidance for Quail input method in some window.
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 9f3cfd7..c8bd628 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -404,7 +404,7 @@ A value of nil means highlight all matches shown on the 
screen."
                 (integer :tag "Some"))
   :group 'lazy-highlight)
 
-(defcustom lazy-highlight-buffer-max-at-a-time 20
+(defcustom lazy-highlight-buffer-max-at-a-time 200 ; 20 (bug#48581)
   "Maximum matches to highlight at a time (for `lazy-highlight-buffer').
 Larger values may reduce Isearch's responsiveness to user input;
 smaller values make matches highlight slowly.
@@ -412,7 +412,7 @@ A value of nil means highlight all matches in the buffer."
   :type '(choice (const :tag "All" nil)
                 (integer :tag "Some"))
   :group 'lazy-highlight
-  :version "27.1")
+  :version "28.1")
 
 (defcustom lazy-highlight-buffer nil
   "Controls the lazy-highlighting of the full buffer.
@@ -2538,7 +2538,7 @@ If search string is empty, just beep."
   "Read a string from the `kill-ring' and append it to the search string."
   (interactive)
   (with-isearch-suspended
-   (let ((string (read-from-kill-ring)))
+   (let ((string (read-from-kill-ring "Yank from kill-ring: ")))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
@@ -3506,9 +3506,8 @@ Optional third argument, if t, means if fail just return 
nil (no error).
     (when pos1
       ;; When using multiple buffers isearch, switch to the new buffer here,
       ;; because `save-excursion' above doesn't allow doing it inside funcall.
-      (if (and multi-isearch-next-buffer-current-function
-              (buffer-live-p multi-isearch-current-buffer))
-         (switch-to-buffer multi-isearch-current-buffer))
+      (when multi-isearch-next-buffer-current-function
+        (multi-isearch-switch-buffer))
       (goto-char pos1)
       pos1)))
 
diff --git a/lisp/isearchb.el b/lisp/isearchb.el
index 67020b7..eaf7983 100644
--- a/lisp/isearchb.el
+++ b/lisp/isearchb.el
@@ -7,7 +7,6 @@
 ;; Created: 16 Apr 2004
 ;; Version: 1.5
 ;; Keywords: lisp
-;; X-URL: http://www.newartisans.com/johnw/emacs.html
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/jka-compr.el b/lisp/jka-compr.el
index a622364..2f98c8d 100644
--- a/lisp/jka-compr.el
+++ b/lisp/jka-compr.el
@@ -659,7 +659,7 @@ It is not recommended to set this variable permanently to 
anything but nil.")
   "Uninstall jka-compr.
 This removes the entries in `file-name-handler-alist' and `auto-mode-alist'
 and `inhibit-local-variables-suffixes' that were added
-by `jka-compr-installed'."
+by `jka-compr-install'."
   ;; Delete from inhibit-local-variables-suffixes what jka-compr-install added.
   (mapc
      (lambda (x)
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index 303f38a..8821e35 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -167,53 +167,53 @@ macro to be executed before appending to it."
 (defvar kmacro-keymap
   (let ((map (make-sparse-keymap)))
     ;; Start, end, execute macros
-    (define-key map "s"    'kmacro-start-macro)
-    (define-key map "\C-s" 'kmacro-start-macro)
-    (define-key map "\C-k" 'kmacro-end-or-call-macro-repeat)
-    (define-key map "r"    'apply-macro-to-region-lines)
-    (define-key map "q"    'kbd-macro-query)  ;; Like C-x q
-    (define-key map "Q"    'kdb-macro-redisplay)
+    (define-key map "s"    #'kmacro-start-macro)
+    (define-key map "\C-s" #'kmacro-start-macro)
+    (define-key map "\C-k" #'kmacro-end-or-call-macro-repeat)
+    (define-key map "r"    #'apply-macro-to-region-lines)
+    (define-key map "q"    #'kbd-macro-query)  ;; Like C-x q
+    (define-key map "Q"    #'kdb-macro-redisplay)
 
     ;; macro ring
-    (define-key map "\C-n" 'kmacro-cycle-ring-next)
-    (define-key map "\C-p" 'kmacro-cycle-ring-previous)
-    (define-key map "\C-v" 'kmacro-view-macro-repeat)
-    (define-key map "\C-d" 'kmacro-delete-ring-head)
-    (define-key map "\C-t" 'kmacro-swap-ring)
-    (define-key map "\C-l" 'kmacro-call-ring-2nd-repeat)
+    (define-key map "\C-n" #'kmacro-cycle-ring-next)
+    (define-key map "\C-p" #'kmacro-cycle-ring-previous)
+    (define-key map "\C-v" #'kmacro-view-macro-repeat)
+    (define-key map "\C-d" #'kmacro-delete-ring-head)
+    (define-key map "\C-t" #'kmacro-swap-ring)
+    (define-key map "\C-l" #'kmacro-call-ring-2nd-repeat)
 
     ;; macro counter
-    (define-key map "\C-f" 'kmacro-set-format)
-    (define-key map "\C-c" 'kmacro-set-counter)
-    (define-key map "\C-i" 'kmacro-insert-counter)
-    (define-key map "\C-a" 'kmacro-add-counter)
+    (define-key map "\C-f" #'kmacro-set-format)
+    (define-key map "\C-c" #'kmacro-set-counter)
+    (define-key map "\C-i" #'kmacro-insert-counter)
+    (define-key map "\C-a" #'kmacro-add-counter)
 
     ;; macro editing
-    (define-key map "\C-e" 'kmacro-edit-macro-repeat)
-    (define-key map "\r"   'kmacro-edit-macro)
-    (define-key map "e"    'edit-kbd-macro)
-    (define-key map "l"    'kmacro-edit-lossage)
-    (define-key map " "    'kmacro-step-edit-macro)
+    (define-key map "\C-e" #'kmacro-edit-macro-repeat)
+    (define-key map "\r"   #'kmacro-edit-macro)
+    (define-key map "e"    #'edit-kbd-macro)
+    (define-key map "l"    #'kmacro-edit-lossage)
+    (define-key map " "    #'kmacro-step-edit-macro)
 
     ;; naming and binding
-    (define-key map "b"    'kmacro-bind-to-key)
-    (define-key map "n"    'kmacro-name-last-macro)
-    (define-key map "x"    'kmacro-to-register)
+    (define-key map "b"    #'kmacro-bind-to-key)
+    (define-key map "n"    #'kmacro-name-last-macro)
+    (define-key map "x"    #'kmacro-to-register)
     map)
   "Keymap for keyboard macro commands.")
 (defalias 'kmacro-keymap kmacro-keymap)
 
 ;;; Provide some binding for startup:
-;;;###autoload (global-set-key "\C-x(" 'kmacro-start-macro)
-;;;###autoload (global-set-key "\C-x)" 'kmacro-end-macro)
-;;;###autoload (global-set-key "\C-xe" 'kmacro-end-and-call-macro)
-;;;###autoload (global-set-key [f3] 'kmacro-start-macro-or-insert-counter)
-;;;###autoload (global-set-key [f4] 'kmacro-end-or-call-macro)
-;;;###autoload (global-set-key "\C-x\C-k" 'kmacro-keymap)
+;;;###autoload (global-set-key "\C-x(" #'kmacro-start-macro)
+;;;###autoload (global-set-key "\C-x)" #'kmacro-end-macro)
+;;;###autoload (global-set-key "\C-xe" #'kmacro-end-and-call-macro)
+;;;###autoload (global-set-key [f3] #'kmacro-start-macro-or-insert-counter)
+;;;###autoload (global-set-key [f4] #'kmacro-end-or-call-macro)
+;;;###autoload (global-set-key "\C-x\C-k" #'kmacro-keymap)
 ;;;###autoload (autoload 'kmacro-keymap "kmacro" "Keymap for keyboard macro 
commands." t 'keymap)
 
 (if kmacro-call-mouse-event
-  (global-set-key (vector kmacro-call-mouse-event) 'kmacro-end-call-mouse))
+  (global-set-key (vector kmacro-call-mouse-event) #'kmacro-end-call-mouse))
 
 
 ;;; Called from keyboard-quit
@@ -482,7 +482,7 @@ without repeating the prefix."
 
 
 (defun kmacro-view-ring-2nd ()
-  "Display the current head of the keyboard macro ring."
+  "Display the second macro in the keyboard macro ring."
   (interactive)
   (unless (kmacro-ring-empty-p)
     (kmacro-display (car (car kmacro-ring)) nil "2nd macro")))
@@ -668,11 +668,13 @@ use \\[kmacro-name-last-macro]."
       (set-transient-map
        (let ((map (make-sparse-keymap)))
          (define-key map (vector repeat-key)
-           `(lambda () (interactive)
-              (kmacro-call-macro ,(and kmacro-call-repeat-with-arg arg)
-                                 'repeating nil ,(if end-macro
-                                                    last-kbd-macro
-                                                  (or macro last-kbd-macro)))))
+           (let ((ra (and kmacro-call-repeat-with-arg arg))
+                 (m (if end-macro
+                       last-kbd-macro
+                     (or macro last-kbd-macro))))
+             (lambda ()
+               (interactive)
+               (kmacro-call-macro ra 'repeating nil m))))
          map)))))
 
 
@@ -782,23 +784,36 @@ If kbd macro currently being defined end it before 
activating it."
 ;;;###autoload
 (defun kmacro-lambda-form (mac &optional counter format)
   "Create lambda form for macro bound to symbol or key."
-  (if counter
-      (setq mac (list mac counter format)))
-  `(lambda (&optional arg)
-     "Keyboard macro."
-     (interactive "p")
-     (kmacro-exec-ring-item ',mac arg)))
+  ;; Apparently, there are two different ways this is called:
+  ;; either `counter' and `format' are both provided and `mac' is a vector,
+  ;; or only `mac' is provided, as a list (MAC COUNTER FORMAT).
+  ;; The first is used from `insert-kbd-macro' and `edmacro-finish-edit',
+  ;; while the second is used from within this file.
+  (let ((mac (if counter (list mac counter format) mac)))
+    ;; FIXME: This should be a "funcallable struct"!
+    (lambda (&optional arg)
+      "Keyboard macro."
+      ;; We put an "unused prompt" as a special marker so
+      ;; `kmacro-extract-lambda' can see it's "one of us".
+      (interactive "pkmacro")
+      (if (eq arg 'kmacro--extract-lambda)
+          (cons 'kmacro--extract-lambda mac)
+        (kmacro-exec-ring-item mac arg)))))
 
 (defun kmacro-extract-lambda (mac)
   "Extract kmacro from a kmacro lambda form."
-  (and (eq (car-safe mac) 'lambda)
-       (setq mac (assoc 'kmacro-exec-ring-item mac))
-       (setq mac (car-safe (cdr-safe (car-safe (cdr-safe mac)))))
-       (listp mac)
-       (= (length mac) 3)
-       (arrayp (car mac))
-       mac))
-
+  (let ((mac (cond
+              ((eq (car-safe mac) 'lambda)
+               (let ((e (assoc 'kmacro-exec-ring-item mac)))
+                 (car-safe (cdr-safe (car-safe (cdr-safe e))))))
+              ((and (functionp mac)
+                    (equal (interactive-form mac) '(interactive "pkmacro")))
+               (let ((r (funcall mac 'kmacro--extract-lambda)))
+                 (and (eq (car-safe r) 'kmacro--extract-lambda) (cdr r)))))))
+    (and (consp mac)
+         (= (length mac) 3)
+         (arrayp (car mac))
+         mac)))
 
 (defalias 'kmacro-p #'kmacro-extract-lambda
   "Return non-nil if MAC is a kmacro keyboard macro.")
@@ -965,7 +980,7 @@ without repeating the prefix."
   "Edit most recent 300 keystrokes as a keyboard macro."
   (interactive)
   (kmacro-push-ring)
-  (edit-kbd-macro "\C-hl"))
+  (edit-kbd-macro (car (where-is-internal 'view-lossage))))
 
 
 ;;; Single-step editing of keyboard macros
diff --git a/lisp/language/ethio-util.el b/lisp/language/ethio-util.el
index fa31cd5..dc385b0 100644
--- a/lisp/language/ethio-util.el
+++ b/lisp/language/ethio-util.el
@@ -98,48 +98,74 @@
 ;; users' preference
 ;;
 
-(defvar ethio-primary-language 'tigrigna
+(defgroup ethiopic nil
+  "Options for writing Ethiopic."
+  :version "28.1"
+  :group 'languages)
+
+(defcustom ethio-primary-language 'tigrigna
   "Symbol that defines the primary language in SERA --> FIDEL conversion.
-The value should be one of: `tigrigna', `amharic' or `english'.")
+The value should be one of: `tigrigna', `amharic' or `english'."
+  :version "28.1"
+  :type '(choice (const :tag "Tigrigna" tigrigna)
+                 (const :tag "Amharic" amharic)
+                 (const :tag "English" english)))
 
-(defvar ethio-secondary-language 'english
+(defcustom ethio-secondary-language 'english
   "Symbol that defines the secondary language in SERA --> FIDEL conversion.
-The value should be one of: `tigrigna', `amharic' or `english'.")
+The value should be one of: `tigrigna', `amharic' or `english'."
+  :version "28.1"
+  :type '(choice (const :tag "Tigrigna" tigrigna)
+                 (const :tag "Amharic" amharic)
+                 (const :tag "English" english)))
 
-(defvar ethio-use-colon-for-colon nil
+(defcustom ethio-use-colon-for-colon nil
   "Non-nil means associate ASCII colon with Ethiopic colon.
 If nil, associate ASCII colon with Ethiopic word separator, i.e., two
 vertically stacked dots.  All SERA <--> FIDEL converters refer this
-variable.")
+variable."
+  :version "28.1"
+  :type 'boolean)
 
-(defvar ethio-use-three-dot-question nil
+(defcustom ethio-use-three-dot-question nil
   "If non-nil, associate ASCII question mark with Ethiopic question mark.
 The Ethiopic old style question mark is three vertically stacked dots.
 If nil, associate ASCII question mark with Ethiopic stylized question
-mark.  All SERA <--> FIDEL converters refer this variable.")
+mark.  All SERA <--> FIDEL converters refer this variable."
+  :version "28.1"
+  :type 'boolean)
 
-(defvar ethio-quote-vowel-always nil
+(defcustom ethio-quote-vowel-always nil
   "Non-nil means always put an apostrophe before an isolated vowel.
 This happens in FIDEL --> SERA conversions.  Isolated vowels at
 word beginning do not get an apostrophe put before them.
 If nil, put an apostrophe only between a 6th-form consonant and an
-isolated vowel.")
+isolated vowel."
+  :version "28.1"
+  :type 'boolean)
 
-(defvar ethio-W-sixth-always nil
+(defcustom ethio-W-sixth-always nil
   "Non-nil means convert the Wu-form of a 12-form consonant to \"W'\".
-This is instead of \"Wu\" in FIDEL --> SERA conversion.")
+This is instead of \"Wu\" in FIDEL --> SERA conversion."
+  :version "28.1"
+  :type 'boolean)
 
-(defvar ethio-numeric-reduction 0
+(defcustom ethio-numeric-reduction 0
   "Degree of reduction in converting Ethiopic digits into Arabic digits.
 Should be 0, 1 or 2.
 For example, ({10}{9}{100}{80}{7}) is converted into:
     \\=`10\\=`9\\=`100\\=`80\\=`7  if `ethio-numeric-reduction' is 0,
     \\=`109100807          if `ethio-numeric-reduction' is 1,
-    \\=`10900807           if `ethio-numeric-reduction' is 2.")
+    \\=`10900807           if `ethio-numeric-reduction' is 2."
+  :version "28.1"
+  :type 'integer)
 
-(defvar ethio-java-save-lowercase nil
+(defcustom ethio-java-save-lowercase nil
   "Non-nil means save Ethiopic characters in lowercase hex numbers to Java 
files.
-If nil, use uppercases.")
+If nil, use uppercases."
+  :version "28.1"
+  :type 'boolean)
+
 
 (defun ethio-prefer-amharic-p ()
   (or (eq ethio-primary-language 'amharic)
diff --git a/lisp/language/japan-util.el b/lisp/language/japan-util.el
index 948bfef..f3e3590 100644
--- a/lisp/language/japan-util.el
+++ b/lisp/language/japan-util.el
@@ -96,9 +96,9 @@ HANKAKU-KATAKANA belongs to `japanese-jisx0201-kana'.")
          (put-char-code-property jisx0201 'jisx0208 katakana)))))
 
 (defconst japanese-symbol-table
-  '((?\  ?\ ) (?, ?, ?、) (?. ?. ?。) (?、 ?, ?、) (?。 ?. ?。) (?・ nil ?・)
+  '((?\  ?\ ) (?, ?,) (?. ?.) (?、 nil ?、) (?。 nil ?。) (?・ nil ?・)
     (?: ?:) (?; ?\;) (?? ??) (?! ?!) (?゛ nil ?゙) (?゜ nil ?゚)
-    (?´ ?') (?` ?`) (?^ ?^) (?_ ?_) (?ー ?- ?ー) (?— ?-) (?‐ ?-)
+    (?´ ?') (?` ?`) (?^ ?^) (?_ ?_) (?ー nil ?ー) (?— ?-) (?‐ ?-)
     (?/ ?/) (?\ ?\\) (?〜 ?~)  (?| ?|) (?‘ ?`) (?’ ?') (?“ ?\") (?” ?\")
     (?\( ?\() (?\) ?\)) (?\[ ?\[) (?\] ?\]) (?\{ ?{) (?\} ?})
     (?〈 ?<) (?〉 ?>) (?\「 nil ?\「) (?\」 nil ?\」)
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 412751b..89154ae 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -511,14 +511,17 @@ Return t if `allout-mode' is active in current buffer." 
nil t)
 (autoload 'allout-mode "allout" "\
 Toggle Allout outline mode.
 
-If called interactively, toggle `Allout mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Allout
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `allout-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -832,14 +835,17 @@ See `allout-widgets-mode' for allout widgets mode 
features.")
 (autoload 'allout-widgets-mode "allout-widgets" "\
 Toggle Allout Widgets mode.
 
-If called interactively, toggle `Allout-Widgets mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Allout-Widgets mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `allout-widgets-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1063,7 +1069,7 @@ or a non-nil `apropos-do-all' argument.
 
 \(fn PATTERN)" t nil)
 
-(defalias 'command-apropos 'apropos-command)
+(defalias 'command-apropos #'apropos-command)
 
 (autoload 'apropos-command "apropos" "\
 Show commands (interactively callable functions) that match PATTERN.
@@ -1200,17 +1206,17 @@ in array mode may have different values assigned to the 
variables.
 The variables are:
 
 Variables you assign:
-     array-max-row:          The number of rows in the array.
-     array-max-column:       The number of columns in the array.
-     array-columns-per-line: The number of columns in the array
+     `array-max-row':          The number of rows in the array.
+     `array-max-column':       The number of columns in the array.
+     `array-columns-per-line': The number of columns in the array
                              per line of buffer.
-     array-field-width:      The width of each field, in characters.
-     array-rows-numbered:    A logical variable describing whether to ignore
+     `array-field-width':      The width of each field, in characters.
+     `array-rows-numbered':    A logical variable describing whether to ignore
                              row numbers in the buffer.
 
 Variables which are calculated:
-     array-line-length:      The number of characters in a buffer line.
-     array-lines-per-row:    The number of buffer lines used to
+     `array-line-length':      The number of characters in a buffer line.
+     `array-lines-per-row':    The number of buffer lines used to
                              display each row.
 
   The following commands are available (an asterisk indicates it may
@@ -1258,14 +1264,17 @@ Entering array mode calls the function 
`array-mode-hook'.
 (autoload 'artist-mode "artist" "\
 Toggle Artist mode.
 
-If called interactively, toggle `Artist mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Artist
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `artist-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1597,14 +1606,17 @@ or call the function `autoarg-kp-mode'.")
 (autoload 'autoarg-kp-mode "autoarg" "\
 Toggle Autoarg-KP mode, a global minor mode.
 
-If called interactively, toggle `Autoarg-Kp mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Autoarg-Kp
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'autoarg-kp-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1659,14 +1671,17 @@ or call the function `auto-insert-mode'.")
 (autoload 'auto-insert-mode "autoinsert" "\
 Toggle Auto-insert mode, a global minor mode.
 
-If called interactively, toggle `Auto-Insert mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Auto-Insert mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'auto-insert-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1752,14 +1767,17 @@ should be non-nil)." nil nil)
 (autoload 'auto-revert-mode "autorevert" "\
 Toggle reverting buffer when the file changes (Auto-Revert Mode).
 
-If called interactively, toggle `Auto-Revert mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Auto-Revert mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `auto-revert-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1785,14 +1803,17 @@ This function is designed to be added to hooks, for 
example:
 (autoload 'auto-revert-tail-mode "autorevert" "\
 Toggle reverting tail of buffer when the file grows.
 
-If called interactively, toggle `Auto-Revert-Tail mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Auto-Revert-Tail mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `auto-revert-tail-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1832,14 +1853,17 @@ or call the function `global-auto-revert-mode'.")
 (autoload 'global-auto-revert-mode "autorevert" "\
 Toggle Global Auto-Revert Mode.
 
-If called interactively, toggle `Global Auto-Revert mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+Auto-Revert mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-auto-revert-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -1969,14 +1993,17 @@ or call the function `display-battery-mode'.")
 (autoload 'display-battery-mode "battery" "\
 Toggle battery status display in mode line (Display Battery mode).
 
-If called interactively, toggle `Display-Battery mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Display-Battery mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'display-battery-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -2592,7 +2619,7 @@ Emacs 28.1 and will be removed in a future release.
 \(fn URL &optional KIND)" nil nil)
 
 (autoload 'browse-url-of-file "browse-url" "\
-Ask a WWW browser to display FILE.
+Use a web browser to display FILE.
 Display the current buffer's file if FILE is nil or if called
 interactively.  Turn the filename into a URL with function
 `browse-url-file-url'.  Pass the URL to a browser using the
@@ -2601,7 +2628,9 @@ interactively.  Turn the filename into a URL with function
 \(fn &optional FILE)" t nil)
 
 (autoload 'browse-url-of-buffer "browse-url" "\
-Ask a WWW browser to display BUFFER.
+Use a web browser to display BUFFER.
+See `browse-url' for details.
+
 Display the current buffer if BUFFER is nil.  Display only the
 currently visible part of BUFFER (from a temporary file) if buffer is
 narrowed.
@@ -2612,19 +2641,24 @@ narrowed.
 In Dired, ask a WWW browser to display the file named on this line." t nil)
 
 (autoload 'browse-url-of-region "browse-url" "\
-Ask a WWW browser to display the current region.
+Use a web browser to display the current region.
+See `browse-url' for details.
 
 \(fn MIN MAX)" t nil)
 
 (autoload 'browse-url "browse-url" "\
-Ask a WWW browser to load URL.
-Prompt for a URL, defaulting to the URL at or before point.
-Invokes a suitable browser function which does the actual job.
+Open URL using a configurable method.
+This will typically (by default) open URL with an external web
+browser, but a wide variety of different methods can be used,
+depending on the URL type.
 
 The variables `browse-url-browser-function',
 `browse-url-handlers', and `browse-url-default-handlers'
 determine which browser function to use.
 
+This command prompts for a URL, defaulting to the URL at or
+before point.
+
 The additional ARGS are passed to the browser function.  See the
 doc strings of the actual functions, starting with
 `browse-url-browser-function', for information about the
@@ -2636,8 +2670,8 @@ If ARGS are omitted, the default is to pass
 \(fn URL &rest ARGS)" t nil)
 
 (autoload 'browse-url-at-point "browse-url" "\
-Ask a WWW browser to load the URL at or before point.
-Variable `browse-url-browser-function' says which browser to use.
+Open URL at point using a configurable method.
+See `browse-url' for details.
 Optional prefix argument ARG non-nil inverts the value of the option
 `browse-url-new-window-flag'.
 
@@ -2653,10 +2687,11 @@ opposite of the browser kind of 
`browse-url-browser-function'.
 \(fn KIND URL &optional ARG)" t nil)
 
 (autoload 'browse-url-at-mouse "browse-url" "\
-Ask a WWW browser to load a URL clicked with the mouse.
-The URL is the one around or before the position of the mouse click
-but point is not changed.  Variable `browse-url-browser-function'
-says which browser to use.
+Use a web browser to load a URL clicked with the mouse.
+See `browse-url' for details.
+
+The URL is the one around or before the position of the mouse
+click but point is not changed.
 
 \(fn EVENT)" t nil)
 
@@ -2894,6 +2929,13 @@ from `browse-url-elinks-wrapper'.
 
 \(fn URL &optional NEW-WINDOW)" t nil)
 
+(autoload 'browse-url-button-open-url "browse-url" "\
+Open URL using `browse-url'.
+If `current-prefix-arg' is non-nil, use
+`browse-url-secondary-browser-function' instead.
+
+\(fn URL)" nil nil)
+
 (register-definition-prefixes "browse-url" '("browse-url-"))
 
 ;;;***
@@ -2967,14 +3009,17 @@ columns on its right towards the left.
 (autoload 'bug-reference-mode "bug-reference" "\
 Toggle hyperlinking bug references in the buffer (Bug Reference mode).
 
-If called interactively, toggle `Bug-Reference mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Bug-Reference mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `bug-reference-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -2983,14 +3028,17 @@ disabled.
 (autoload 'bug-reference-prog-mode "bug-reference" "\
 Like `bug-reference-mode', but only buttonize in comments and strings.
 
-If called interactively, toggle `Bug-Reference-Prog mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Bug-Reference-Prog mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `bug-reference-prog-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -3140,7 +3188,7 @@ and corresponding effects.
 
 \(fn &optional ARG)" nil nil)
 
-(register-definition-prefixes "bytecomp" '("batch-byte-compile-file" "byte-" 
"displaying-byte-compile-warnings" "emacs-lisp-" "no-byte-compile"))
+(register-definition-prefixes "bytecomp" '("batch-byte-compile-file" "byte" 
"displaying-byte-compile-warnings" "emacs-lisp-" "no-byte-compile"))
 
 ;;;***
 
@@ -4079,7 +4127,7 @@ in this way.
 If DONT-OVERRIDE is t, style variables that already have values (i.e., whose
 values are not the symbol `set-from-style') will not be overridden.  CC Mode
 calls c-set-style internally in this way whilst initializing a buffer; if
-cc-set-style is called like this from anywhere else, it will usually behave as
+c-set-style is called like this from anywhere else, it will usually behave as
 a null operation.
 
 \(fn STYLENAME &optional DONT-OVERRIDE)" t nil)
@@ -4727,14 +4775,17 @@ Prefix argument is the same as for `checkdoc-defun'." t 
nil)
 (autoload 'checkdoc-minor-mode "checkdoc" "\
 Toggle automatic docstring checking (Checkdoc minor mode).
 
-If called interactively, toggle `Checkdoc minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Checkdoc
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `checkdoc-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -4843,14 +4894,18 @@ or call the function `cl-font-lock-built-in-mode'.")
 (autoload 'cl-font-lock-built-in-mode "cl-font-lock" "\
 Highlight built-in functions, variables, and types in `lisp-mode'.
 
-If called interactively, toggle `Cl-Font-Lock-Built-In mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Cl-Font-Lock-Built-In mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'cl-font-lock-built-in-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -4891,7 +4946,7 @@ DEFAULT-BODY, if present, is used as the body of a 
default method.
 
 (autoload 'cl-defmethod "cl-generic" "\
 Define a new method for generic function NAME.
-This it defines an implementation of NAME to use for invocations
+This defines an implementation of NAME to use for invocations
 of specific types of arguments.
 
 ARGS is a list of dispatch arguments (see `cl-defun'), but where
@@ -5075,14 +5130,17 @@ This can be needed when using code byte-compiled using 
the old
 macro-expansion of `cl-defstruct' that used vectors objects instead
 of record objects.
 
-If called interactively, toggle `Cl-Old-Struct-Compat mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Cl-Old-Struct-Compat mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'cl-old-struct-compat-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -5321,6 +5379,96 @@ REGEXP-GROUP is the regular expression group in REGEXP 
to use.
 
 ;;;***
 
+;;;### (autoloads nil "comp" "emacs-lisp/comp.el" (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/comp.el
+(put 'no-native-compile 'safe-local-variable 'booleanp)
+
+(autoload 'comp-subr-trampoline-install "comp" "\
+Make SUBR-NAME effectively advice-able when called from native code.
+
+\(fn SUBR-NAME)" nil nil)
+
+(autoload 'comp-c-func-name "comp" "\
+Given NAME, return a name suitable for the native code.
+Add PREFIX in front of it.  If FIRST is not nil, pick the first
+available name ignoring compilation context and potential name
+clashes.
+
+\(fn NAME PREFIX &optional FIRST)" nil nil)
+
+(autoload 'comp-clean-up-stale-eln "comp" "\
+Given FILE remove all its *.eln files in `native-comp-eln-load-path'
+sharing the original source filename (including FILE).
+
+\(fn FILE)" nil nil)
+
+(autoload 'comp-lookup-eln "comp" "\
+Given a Lisp source FILENAME return the corresponding .eln file if found.
+Search happens in `native-comp-eln-load-path'.
+
+\(fn FILENAME)" nil nil)
+
+(autoload 'native-compile "comp" "\
+Compile FUNCTION-OR-FILE into native code.
+This is the synchronous entry-point for the Emacs Lisp native
+compiler.
+FUNCTION-OR-FILE is a function symbol, a form, or the filename of
+an Emacs Lisp source file.
+If OUTPUT is non-nil, use it as the filename for the compiled
+object.
+If FUNCTION-OR-FILE is a filename, return the filename of the
+compiled object.  If FUNCTION-OR-FILE is a function symbol or a
+form, return the compiled function.
+
+\(fn FUNCTION-OR-FILE &optional OUTPUT)" nil nil)
+
+(autoload 'batch-native-compile "comp" "\
+Perform native compilation on remaining command-line arguments.
+Use this from the command line, with ‘-batch’;
+it won’t work in an interactive Emacs.
+Native compilation equivalent to `batch-byte-compile'." nil nil)
+
+(autoload 'batch-byte+native-compile "comp" "\
+Like `batch-native-compile', but used for bootstrap.
+Generate .elc files in addition to the .eln files.
+Force the produced .eln to be outputted in the eln system
+directory (the last entry in `native-comp-eln-load-path') unless
+`native-compile-target-directory' is non-nil.  If the environment
+variable 'NATIVE_DISABLED' is set, only byte compile." nil nil)
+
+(autoload 'native-compile-async "comp" "\
+Compile FILES asynchronously.
+FILES is one file or a list of filenames or directories.
+
+If optional argument RECURSIVELY is non-nil, recurse into
+subdirectories of given directories.
+
+If optional argument LOAD is non-nil, request to load the file
+after compiling.
+
+The optional argument SELECTOR has the following valid values:
+
+nil -- Select all files.
+a string -- A regular expression selecting files with matching names.
+a function -- A function selecting files with matching names.
+
+The variable `native-comp-async-jobs-number' specifies the number
+of (commands) to run simultaneously.
+
+\(fn FILES &optional RECURSIVELY LOAD SELECTOR)" nil nil)
+
+(register-definition-prefixes "comp" '("comp-" "make-comp-edge" "native-" 
"no-native-compile"))
+
+;;;***
+
+;;;### (autoloads nil "comp-cstr" "emacs-lisp/comp-cstr.el" (0 0
+;;;;;;  0 0))
+;;; Generated autoloads from emacs-lisp/comp-cstr.el
+
+(register-definition-prefixes "comp-cstr" '("comp-" 
"with-comp-cstr-accessors"))
+
+;;;***
+
 ;;;### (autoloads nil "compare-w" "vc/compare-w.el" (0 0 0 0))
 ;;; Generated autoloads from vc/compare-w.el
 
@@ -5514,14 +5662,18 @@ Runs `compilation-mode-hook' with `run-mode-hooks' 
(which see).
 (autoload 'compilation-shell-minor-mode "compile" "\
 Toggle Compilation Shell minor mode.
 
-If called interactively, toggle `Compilation-Shell minor mode'.  If
-the prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Compilation-Shell minor mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `compilation-shell-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -5535,14 +5687,17 @@ See `compilation-mode'.
 (autoload 'compilation-minor-mode "compile" "\
 Toggle Compilation minor mode.
 
-If called interactively, toggle `Compilation minor mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Compilation minor mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `compilation-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -5578,14 +5733,17 @@ or call the function `dynamic-completion-mode'.")
 (autoload 'dynamic-completion-mode "completion" "\
 Toggle dynamic word-completion on or off.
 
-If called interactively, toggle `Dynamic-Completion mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Dynamic-Completion mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'dynamic-completion-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -6144,14 +6302,17 @@ or call the function `cua-mode'.")
 (autoload 'cua-mode "cua-base" "\
 Toggle Common User Access style editing (CUA mode).
 
-If called interactively, toggle `Cua mode'.  If the prefix argument is
-positive, enable the mode, and if it is zero or negative, disable the
-mode.
+This is a minor mode.  If called interactively, toggle the `Cua mode'
+mode.  If the prefix argument is positive, enable the mode, and if it
+is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'cua-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -6198,14 +6359,17 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v 
bindings.
 Toggle the region as rectangular.
 Activates the region if needed.  Only lasts until the region is deactivated.
 
-If called interactively, toggle `Cua-Rectangle-Mark mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Cua-Rectangle-Mark mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `cua-rectangle-mark-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -6227,14 +6391,17 @@ By convention, this is a list of symbols where each 
symbol stands for the
 (autoload 'cursor-intangible-mode "cursor-sensor" "\
 Keep cursor outside of any `cursor-intangible' text property.
 
-If called interactively, toggle `Cursor-Intangible mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Cursor-Intangible mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `cursor-intangible-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -6248,14 +6415,17 @@ where WINDOW is the affected window, OLDPOS is the last 
known position of
 the cursor and DIR can be `entered' or `left' depending on whether the cursor
 is entering the area covered by the text-property property or leaving it.
 
-If called interactively, toggle `Cursor-Sensor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Cursor-Sensor mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `cursor-sensor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -6634,14 +6804,17 @@ Mode used for cvs status output.
 (autoload 'cwarn-mode "cwarn" "\
 Minor mode that highlights suspicious C and C++ constructions.
 
-If called interactively, toggle `Cwarn mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Cwarn
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `cwarn-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -7099,14 +7272,17 @@ or call the function `delete-selection-mode'.")
 (autoload 'delete-selection-mode "delsel" "\
 Toggle Delete Selection mode.
 
-If called interactively, toggle `Delete-Selection mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Delete-Selection mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'delete-selection-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -7119,6 +7295,13 @@ information on adapting behavior of commands in Delete 
Selection mode.
 
 \(fn &optional ARG)" t nil)
 
+(autoload 'delete-active-region "delsel" "\
+Delete the active region.
+If KILLP is non-nil, or if called interactively with a prefix argument,
+the active region is killed instead of deleted.
+
+\(fn &optional KILLP)" t nil)
+
 (register-definition-prefixes "delsel" '("del" "minibuffer-keyboard-quit"))
 
 ;;;***
@@ -7277,14 +7460,17 @@ or call the function `desktop-save-mode'.")
 (autoload 'desktop-save-mode "desktop" "\
 Toggle desktop saving (Desktop Save mode).
 
-If called interactively, toggle `Desktop-Save mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Desktop-Save mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'desktop-save-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -7759,14 +7945,17 @@ a diff with \\[diff-reverse-direction].
 (autoload 'diff-minor-mode "diff-mode" "\
 Toggle Diff minor mode.
 
-If called interactively, toggle `Diff minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Diff minor
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `diff-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -7782,8 +7971,10 @@ disabled.
 ;;; Generated autoloads from net/dig.el
 
 (autoload 'dig "dig" "\
-Query addresses of a DOMAIN using dig, by calling `dig-invoke'.
-Optional arguments are passed to `dig-invoke'.
+Query addresses of a DOMAIN using dig.
+See `dig-invoke' for an explanation for the parameters.
+When called interactively, DOMAIN is prompted for.  If given a prefix,
+also prompt for the QUERY-TYPE parameter.
 
 \(fn DOMAIN &optional QUERY-TYPE QUERY-CLASS QUERY-OPTION DIG-OPTION SERVER)" 
t nil)
 
@@ -7946,14 +8137,17 @@ Like \\[dired-jump] (`dired-jump') but in other window.
 (autoload 'dirtrack-mode "dirtrack" "\
 Toggle directory tracking in shell buffers (Dirtrack mode).
 
-If called interactively, toggle `Dirtrack mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Dirtrack
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `dirtrack-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -8123,14 +8317,18 @@ in `.emacs'.
 Toggle display of fill-column indicator.
 This uses `display-fill-column-indicator' internally.
 
-If called interactively, toggle `Display-Fill-Column-Indicator mode'.
-If the prefix argument is positive, enable the mode, and if it is zero
-or negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Display-Fill-Column-Indicator mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `display-fill-column-indicator-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -8200,14 +8398,17 @@ list.")
 Toggle display of line numbers in the buffer.
 This uses `display-line-numbers' internally.
 
-If called interactively, toggle `Display-Line-Numbers mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Display-Line-Numbers mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `display-line-numbers-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -8350,14 +8551,17 @@ to the next best mode." nil nil)
 (autoload 'doc-view-minor-mode "doc-view" "\
 Toggle displaying buffer via Doc View (Doc View minor mode).
 
-If called interactively, toggle `Doc-View minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Doc-View
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `doc-view-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -8418,14 +8622,17 @@ Switch to *doctor* buffer and start giving 
psychotherapy." t nil)
 (autoload 'double-mode "double" "\
 Toggle special insertion on double keypresses (Double mode).
 
-If called interactively, toggle `Double mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Double
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `double-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -8460,7 +8667,7 @@ Switch to *dungeon* buffer and start game." t nil)
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
-(defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
+(defalias 'easy-mmode-define-minor-mode #'define-minor-mode)
 
 (autoload 'define-minor-mode "easy-mmode" "\
 Define a new minor mode MODE.
@@ -8483,39 +8690,31 @@ documenting what its argument does.  If the word 
\"ARG\" does not
 appear in DOC, a paragraph is added to DOC explaining
 usage of the mode argument.
 
-Optional INIT-VALUE is the initial value of the mode's variable.
-  Note that the minor mode function won't be called by setting
-  this option, so the value *reflects* the minor mode's natural
-  initial state, rather than *setting* it.
-  In the vast majority of cases it should be nil.
-Optional LIGHTER is displayed in the mode line when the mode is on.
-Optional KEYMAP is the default keymap bound to the mode keymap.
-  If non-nil, it should be a variable name (whose value is a keymap),
-  or an expression that returns either a keymap or a list of
-  (KEY . BINDING) pairs where KEY and BINDING are suitable for
-  `define-key'.  If you supply a KEYMAP argument that is not a
-  symbol, this macro defines the variable MODE-map and gives it
-  the value that KEYMAP specifies.
-
 BODY contains code to execute each time the mode is enabled or disabled.
   It is executed after toggling the mode, and before running MODE-hook.
   Before the actual body code, you can write keyword arguments, i.e.
   alternating keywords and values.  If you provide BODY, then you must
-  provide (even if just nil) INIT-VALUE, LIGHTER, and KEYMAP, or provide
-  at least one keyword argument, or both; otherwise, BODY would be
-  misinterpreted as the first omitted argument.  The following special
-  keywords are supported (other keywords are passed to `defcustom' if
-  the minor mode is global):
+  provide at least one keyword argument (e.g. `:lighter nil`).
+  The following special keywords are supported (other keywords are passed
+  to `defcustom' if the minor mode is global):
 
-:group GROUP   Custom group name to use in all generated `defcustom' forms.
 :global GLOBAL If non-nil specifies that the minor mode is not meant to be
                buffer-local, so don't make the variable MODE buffer-local.
                By default, the mode is buffer-local.
-:init-value VAL        Same as the INIT-VALUE argument.
+:init-value VAL        the initial value of the mode's variable.
+               Note that the minor mode function won't be called by setting
+               this option, so the value *reflects* the minor mode's natural
+               initial state, rather than *setting* it.
+               In the vast majority of cases it should be nil.
                Not used if you also specify :variable.
-:lighter SPEC  Same as the LIGHTER argument.
-:keymap MAP    Same as the KEYMAP argument.
-:require SYM   Same as in `defcustom'.
+:lighter SPEC  Text displayed in the mode line when the mode is on.
+:keymap MAP    Keymap bound to the mode keymap.  Defaults to `MODE-map'.
+               If non-nil, it should be a variable name (whose value is
+               a keymap), or an expression that returns either a keymap or
+               a list of (KEY . BINDING) pairs where KEY and BINDING are
+               suitable for `define-key'.  If you supply a KEYMAP argument
+               that is not a symbol, this macro defines the variable MODE-map
+               and gives it the value that KEYMAP specifies.
 :interactive VAL  Whether this mode should be a command or not.  The default
                 is to make it one; use nil to avoid that.  If VAL is a list,
                 it's interpreted as a list of major modes this minor mode
@@ -8529,7 +8728,6 @@ BODY contains code to execute each time the mode is 
enabled or disabled.
                sets it.  If you specify a :variable, this function does
                not define a MODE variable (nor any of the terms used
                in :variable).
-
 :after-hook     A single lisp form which is evaluated after the mode hooks
                 have been run.  It should not be quoted.
 
@@ -8538,13 +8736,17 @@ For example, you could write
     :lighter \" Foo\" :require \\='foo :global t :group \\='hassle :version 
\"27.5\"
     ...BODY CODE...)
 
-\(fn MODE DOC &optional INIT-VALUE LIGHTER KEYMAP &rest BODY)" nil t)
+For backward compatibility with the Emacs<21 calling convention,
+the keywords can also be preceded by the obsolete triplet
+INIT-VALUE LIGHTER KEYMAP.
+
+\(fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t)
 
 (function-put 'define-minor-mode 'doc-string-elt '2)
 
-(defalias 'easy-mmode-define-global-mode 'define-globalized-minor-mode)
+(defalias 'easy-mmode-define-global-mode #'define-globalized-minor-mode)
 
-(defalias 'define-global-minor-mode 'define-globalized-minor-mode)
+(defalias 'define-global-minor-mode #'define-globalized-minor-mode)
 
 (autoload 'define-globalized-minor-mode "easy-mmode" "\
 Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
@@ -9120,14 +9322,17 @@ or call the function `global-ede-mode'.")
 (autoload 'global-ede-mode "ede" "\
 Toggle global EDE (Emacs Development Environment) mode.
 
-If called interactively, toggle `Global Ede mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global Ede
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-ede-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -9304,6 +9509,26 @@ an EDE controlled project.
 ;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
+(defvar edebug-all-defs nil "\
+If non-nil, evaluating defining forms instruments for Edebug.
+This applies to `eval-defun', `eval-region', `eval-buffer', and
+`eval-current-buffer'.  `eval-region' is also called by
+`eval-last-sexp', and `eval-print-last-sexp'.
+
+You can use the command `edebug-all-defs' to toggle the value of this
+variable.  You may wish to make it local to each buffer with
+\(make-local-variable \\='edebug-all-defs) in your
+`emacs-lisp-mode-hook'.")
+
+(custom-autoload 'edebug-all-defs "edebug" t)
+
+(defvar edebug-all-forms nil "\
+Non-nil means evaluation of all forms will instrument for Edebug.
+This doesn't apply to loading or evaluations in the minibuffer.
+Use the command `edebug-all-forms' to toggle the value of this option.")
+
+(custom-autoload 'edebug-all-forms "edebug" t)
+
 (autoload 'edebug-basic-spec "edebug" "\
 Return t if SPEC uses only extant spec symbols.
 An extant spec symbol is a symbol that is not a function and has a
@@ -9954,14 +10179,17 @@ or call the function `electric-pair-mode'.")
 (autoload 'electric-pair-mode "elec-pair" "\
 Toggle automatic parens pairing (Electric Pair mode).
 
-If called interactively, toggle `Electric-Pair mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Electric-Pair mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'electric-pair-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -9978,14 +10206,17 @@ To toggle the mode in a single buffer, use 
`electric-pair-local-mode'.
 (autoload 'electric-pair-local-mode "elec-pair" "\
 Toggle `electric-pair-mode' only in this buffer.
 
-If called interactively, toggle `Electric-Pair-Local mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Electric-Pair-Local mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(buffer-local-value 'electric-pair-mode (current-buffer))'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -10201,14 +10432,17 @@ Minor mode for editing text/enriched files.
 These are files with embedded formatting information in the MIME standard
 text/enriched format.
 
-If called interactively, toggle `Enriched mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Enriched
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `enriched-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -10460,20 +10694,43 @@ Encrypt marked files." t nil)
 
 ;;;***
 
+;;;### (autoloads nil "epa-ks" "epa-ks.el" (0 0 0 0))
+;;; Generated autoloads from epa-ks.el
+
+(autoload 'epa-search-keys "epa-ks" "\
+Ask a keyserver for all keys matching QUERY.
+
+The keyserver to be used is specified by `epa-keyserver'.
+
+If EXACT is non-nil (interactively, prefix argument), require
+exact matches.
+
+Note that the request may fail if the query is not specific
+enough, since keyservers have strict timeout settings.
+
+\(fn QUERY EXACT)" t nil)
+
+(register-definition-prefixes "epa-ks" '("epa-k"))
+
+;;;***
+
 ;;;### (autoloads nil "epa-mail" "epa-mail.el" (0 0 0 0))
 ;;; Generated autoloads from epa-mail.el
 
 (autoload 'epa-mail-mode "epa-mail" "\
 A minor-mode for composing encrypted/clearsigned mails.
 
-If called interactively, toggle `epa-mail mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `epa-mail
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `epa-mail-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -10536,14 +10793,17 @@ or call the function `epa-global-mail-mode'.")
 (autoload 'epa-global-mail-mode "epa-mail" "\
 Minor mode to hook EasyPG into Mail mode.
 
-If called interactively, toggle `Epa-Global-Mail mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Epa-Global-Mail mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'epa-global-mail-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -10617,32 +10877,66 @@ Prompt the user for values of nick, server, port, and 
password." nil nil)
 ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC.
 
-It permits you to select connection parameters, and then starts ERC.
+It allows selecting connection parameters, and then starts ERC.
 
 Non-interactively, it takes the keyword arguments
    (server (erc-compute-server))
    (port   (erc-compute-port))
    (nick   (erc-compute-nick))
    password
-   (full-name (erc-compute-full-name)))
+   (full-name (erc-compute-full-name))
 
 That is, if called with
 
-   (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
+   (erc :server \"chat.freenode.net\" :full-name \"J. Random Hacker\")
 
-then the server and full-name will be set to those values, whereas
-`erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
-be invoked for the values of the other parameters.
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of the other parameters.
 
 \(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)))" t nil)
 
 (defalias 'erc-select #'erc)
 
 (autoload 'erc-tls "erc" "\
-Interactively select TLS connection parameters and run ERC.
-Arguments are the same as for `erc'.
+ERC is a powerful, modular, and extensible IRC client.
+This function is the main entry point for ERC over TLS.
+
+It allows selecting connection parameters, and then starts ERC
+over TLS.
+
+Non-interactively, it takes the keyword arguments
+   (server (erc-compute-server))
+   (port   (erc-compute-port))
+   (nick   (erc-compute-nick))
+   password
+   (full-name (erc-compute-full-name))
+   client-certificate
 
-\(fn &rest R)" t nil)
+That is, if called with
+
+   (erc-tls :server \"chat.freenode.net\" :full-name \"J. Random Hacker\")
+
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of their respective parameters.
+
+CLIENT-CERTIFICATE, if non-nil, should either be a list where the
+first element is the certificate key file name, and the second
+element is the certificate file name itself, or t, which means
+that `auth-source' will be queried for the key and the
+certificate.  Authenticating using a TLS client certificate is
+also refered to as \"CertFP\" (Certificate Fingerprint)
+authentication by various IRC networks.
+
+Example usage:
+
+    (erc-tls :server \"chat.freenode.net\" :port 6697
+             :client-certificate
+             '(\"/home/bandali/my-cert.key\"
+               \"/home/bandali/my-cert.crt\"))
+
+\(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)) 
CLIENT-CERTIFICATE)" t nil)
 
 (autoload 'erc-handle-irc-url "erc" "\
 Use ERC to IRC on HOST:PORT in CHANNEL as USER with PASSWORD.
@@ -11153,7 +11447,7 @@ argument is passed to `next-file', which see).
 (autoload 'tags-search "etags" "\
 Search through all files listed in tags table for match for REGEXP.
 Stops when a match is found.
-To continue searching for next match, use command \\[tags-loop-continue].
+To continue searching for next match, use the command \\[fileloop-continue].
 
 If FILES if non-nil should be a list or an iterator returning the
 files to search.  The search will be restricted to these files.
@@ -11166,7 +11460,7 @@ Also see the documentation of the `tags-file-name' 
variable.
 Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
 If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
-with the command \\[tags-loop-continue].
+with the command \\[fileloop-continue].
 For non-interactive use, superseded by `fileloop-initialize-replace'.
 
 \(fn FROM TO &optional DELIMITED FILES)" t nil)
@@ -11913,14 +12207,17 @@ a top-level keymap, `text-scale-increase' or
 (autoload 'buffer-face-mode "face-remap" "\
 Minor mode for a buffer-specific default face.
 
-If called interactively, toggle `Buffer-Face mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Buffer-Face mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `buffer-face-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -11973,6 +12270,23 @@ Besides the choice of face, it is the same as 
`buffer-face-mode'.
 ;;;### (autoloads nil "facemenu" "facemenu.el" (0 0 0 0))
 ;;; Generated autoloads from facemenu.el
 
+(autoload 'list-colors-display "facemenu" "\
+Display names of defined colors, and show what they look like.
+If the optional argument LIST is non-nil, it should be a list of
+colors to display.  Otherwise, this command computes a list of
+colors that the current display can handle.  Customize
+`list-colors-sort' to change the order in which colors are shown.
+Type `g' or \\[revert-buffer] after customizing `list-colors-sort'
+to redisplay colors in the new order.
+
+If the optional argument BUFFER-NAME is nil, it defaults to *Colors*.
+
+If the optional argument CALLBACK is non-nil, it should be a
+function to call each time the user types RET or clicks on a
+color.  The function should accept a single argument, the color name.
+
+\(fn &optional LIST BUFFER-NAME CALLBACK)" t nil)
+
 (register-definition-prefixes "facemenu" '("facemenu-" "list-colors-"))
 
 ;;;***
@@ -12440,7 +12754,7 @@ specifies what to use in place of \"-ls\" as the final 
argument.
 ;;;### (autoloads nil "find-file" "find-file.el" (0 0 0 0))
 ;;; Generated autoloads from find-file.el
 
-(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) 
(match-end 2)))) "\
+(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") \, (lambda nil (match-string 2)))) "\
 List of special constructs recognized by `ff-treat-as-special'.
 Each element, tried in order, has the form (REGEXP . EXTRACT).
 If REGEXP matches the current line (from the beginning of the line),
@@ -12458,7 +12772,7 @@ If optional IN-OTHER-WINDOW is non-nil, find the file 
in another window.
 
 \(fn &optional IN-OTHER-WINDOW)" t nil)
 
-(defalias 'ff-find-related-file 'ff-find-other-file)
+(defalias 'ff-find-related-file #'ff-find-other-file)
 
 (autoload 'ff-find-other-file "find-file" "\
 Find the header or source file corresponding to this file.
@@ -12467,6 +12781,10 @@ Being on a `#include' line pulls in that file.
 If optional IN-OTHER-WINDOW is non-nil, find the file in the other window.
 If optional IGNORE-INCLUDE is non-nil, ignore being on `#include' lines.
 
+If optional EVENT is non-nil (default `last-nonmenu-event', move
+point to the end position of that event before calling the
+various ff-* hooks.
+
 Variables of interest include:
 
  - `ff-case-fold-search'
@@ -12513,15 +12831,14 @@ Variables of interest include:
  - `ff-file-created-hook'
    List of functions to be called if the other file has been created.
 
-\(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE)" t nil)
+\(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t nil)
 
-(autoload 'ff-mouse-find-other-file "find-file" "\
-Visit the file you click on.
+(define-obsolete-function-alias 'ff-mouse-find-other-file #'ff-find-other-file 
"28.1")
 
-\(fn EVENT)" t nil)
+(define-obsolete-function-alias 'ff-mouse-find-other-file-other-window 
#'ff-find-other-file-other-window "28.1")
 
-(autoload 'ff-mouse-find-other-file-other-window "find-file" "\
-Visit the file you click on in another window.
+(autoload 'ff-find-other-file-other-window "find-file" "\
+Visit the file you point at in another window.
 
 \(fn EVENT)" t nil)
 
@@ -12849,14 +13166,17 @@ region is invalid.  This function saves match data.
 (autoload 'flymake-mode "flymake" "\
 Toggle Flymake mode on or off.
 
-If called interactively, toggle `Flymake mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Flymake
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `flymake-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -12937,14 +13257,17 @@ Turn on `flyspell-mode' for comments and strings." t 
nil)
 (autoload 'flyspell-mode "flyspell" "\
 Toggle on-the-fly spell checking (Flyspell mode).
 
-If called interactively, toggle `Flyspell mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Flyspell
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `flyspell-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -13020,14 +13343,17 @@ Turn off Follow mode.  Please see the function 
`follow-mode'." nil nil)
 (autoload 'follow-mode "follow" "\
 Toggle Follow mode.
 
-If called interactively, toggle `Follow mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Follow
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `follow-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -13150,14 +13476,17 @@ selected if the original window is the first one in 
the frame.
 (autoload 'footnote-mode "footnote" "\
 Toggle Footnote mode.
 
-If called interactively, toggle `Footnote mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Footnote
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `footnote-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -13620,14 +13949,17 @@ being transferred.  This list may grow up to a size of
 `gdb-debug-log-max' after which the oldest element (at the end of
 the list) is deleted every time a new one is added (at the front).
 
-If called interactively, toggle `Gdb-Enable-Debug mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Gdb-Enable-Debug mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'gdb-enable-debug)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -13794,7 +14126,7 @@ regular expression that can be used as an element of
 ;;;### (autoloads nil "generic-x" "generic-x.el" (0 0 0 0))
 ;;; Generated autoloads from generic-x.el
 
-(register-definition-prefixes "generic-x" '("alias-generic-mode" 
"ansible-inventory-generic-mode" "apache-" "astap-generic-mode" 
"default-generic-mode" "etc-" "fvwm-generic-mode" "generic-" 
"hosts-generic-mode" "ibis-generic-mode" "java-" "mail" "named-" 
"pkginfo-generic-mode" "prototype-generic-mode" "rc-generic-mode" "rul-" 
"samba-generic-mode" "show-tabs-generic-mode" "spice-generic-mode" 
"vrml-generic-mode" "x-resource-generic-mode" "xmodmap-generic-mode"))
+(register-definition-prefixes "generic-x" '("default-generic-mode" "generic-"))
 
 ;;;***
 
@@ -13804,14 +14136,17 @@ regular expression that can be used as an element of
 (autoload 'glasses-mode "glasses" "\
 Minor mode for making identifiers likeThis readable.
 
-If called interactively, toggle `Glasses mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Glasses
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `glasses-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -14419,14 +14754,17 @@ If FORCE is non-nil, replace the old ones.
 (autoload 'gnus-mailing-list-mode "gnus-ml" "\
 Minor mode for providing mailing-list commands.
 
-If called interactively, toggle `Gnus-Mailing-List mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Gnus-Mailing-List mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `gnus-mailing-list-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -14629,6 +14967,8 @@ Both lists have to be sorted over <.
 
 \(fn LIST1 LIST2)" nil nil)
 
+(make-obsolete 'gnus-intersection 'seq-intersection '"28.1")
+
 (autoload 'gnus-sorted-intersection "gnus-range" "\
 Return intersection of LIST1 and LIST2.
 LIST1 and LIST2 have to be sorted over <.
@@ -14884,14 +15224,17 @@ Also fontifies the buffer appropriately (see 
`goto-address-fontify-p' and
 (autoload 'goto-address-mode "goto-addr" "\
 Minor mode to buttonize URLs and e-mail addresses in the current buffer.
 
-If called interactively, toggle `Goto-Address mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Goto-Address mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `goto-address-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -14925,14 +15268,17 @@ See `goto-address-mode' for more information on 
Goto-Address mode.
 (autoload 'goto-address-prog-mode "goto-addr" "\
 Like `goto-address-mode', but only for comments and strings.
 
-If called interactively, toggle `Goto-Address-Prog mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Goto-Address-Prog mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `goto-address-prog-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -15265,14 +15611,17 @@ or call the function `gud-tooltip-mode'.")
 (autoload 'gud-tooltip-mode "gud" "\
 Toggle the display of GUD tooltips.
 
-If called interactively, toggle `Gud-Tooltip mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Gud-Tooltip mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'gud-tooltip-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -15625,6 +15974,12 @@ When called from lisp, FUNCTION may also be a function 
object.
 
 \(fn FUNCTION)" t nil)
 
+(autoload 'describe-command "help-fns" "\
+Display the full documentation of COMMAND (a symbol).
+When called from lisp, COMMAND may also be a function object.
+
+\(fn COMMAND)" t nil)
+
 (autoload 'help-C-file-name "help-fns" "\
 Return the name of the C file where SUBR-OR-VAR is defined.
 KIND should be `var' for a variable or `subr' for a subroutine.
@@ -15939,22 +16294,30 @@ also supported.
 
 There are several ways to change text in hexl mode:
 
-ASCII characters (character between space (0x20) and tilde (0x7E)) are
-bound to self-insert so you can simply type the character and it will
-insert itself (actually overstrike) into the buffer.
+Self-inserting characters are bound to `hexl-self-insert' so you
+can simply type the character and it will insert itself (actually
+overstrike) into the buffer.  However, inserting non-ASCII characters
+requires caution: the buffer's coding-system should correspond to
+the encoding on disk, and multibyte characters should be inserted
+with cursor on the first byte of a multibyte sequence whose length
+is identical to the length of the multibyte sequence to be inserted,
+otherwise this could produce invalid multibyte sequences.  Non-ASCII
+characters in ISO-2022 encodings should preferably inserted byte by
+byte, to avoid problems caused by the designation sequences before
+the actual characters.
 
 \\[hexl-quoted-insert] followed by another keystroke allows you to insert the 
key even if
 it isn't bound to self-insert.  An octal number can be supplied in place
 of another key to insert the octal number's ASCII representation.
 
-\\[hexl-insert-hex-char] will insert a given hexadecimal value (if it is 
between 0 and 0xFF)
-into the buffer at the current point.
+\\[hexl-insert-hex-char] will insert a given hexadecimal value
+into the buffer at the current address.
 
-\\[hexl-insert-octal-char] will insert a given octal value (if it is between 0 
and 0377)
-into the buffer at the current point.
+\\[hexl-insert-octal-char] will insert a given octal value
+into the buffer at the current address.
 
-\\[hexl-insert-decimal-char] will insert a given decimal value (if it is 
between 0 and 255)
-into the buffer at the current point.
+\\[hexl-insert-decimal-char] will insert a given decimal value
+into the buffer at the current address..
 
 \\[hexl-mode-exit] will exit `hexl-mode'.
 
@@ -15970,7 +16333,8 @@ You can use \\[hexl-find-file] to visit a file in Hexl 
mode.
 (autoload 'hexl-find-file "hexl" "\
 Edit file FILENAME as a binary file in hex dump format.
 Switch to a buffer visiting file FILENAME, creating one if none exists,
-and edit the file in `hexl-mode'.
+and edit the file in `hexl-mode'.  The buffer's coding-system will be
+no-conversion, unlike if you visit it normally and then invoke `hexl-mode'.
 
 \(fn FILENAME)" t nil)
 
@@ -15988,14 +16352,17 @@ This discards the buffer's undo information." t nil)
 (autoload 'hi-lock-mode "hi-lock" "\
 Toggle selective highlighting of patterns (Hi Lock mode).
 
-If called interactively, toggle `Hi-Lock mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Hi-Lock
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `hi-lock-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16199,14 +16566,17 @@ Add patterns from the current buffer to the list of 
hi-lock patterns." t nil)
 (autoload 'hide-ifdef-mode "hideif" "\
 Toggle features to hide/show #ifdef blocks (Hide-Ifdef mode).
 
-If called interactively, toggle `Hide-Ifdef mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Hide-Ifdef
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `hide-ifdef-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16284,14 +16654,17 @@ whitespace.  Case does not matter.")
 (autoload 'hs-minor-mode "hideshow" "\
 Minor mode to selectively hide/show code and comment blocks.
 
-If called interactively, toggle `Hs minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `hs minor
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `hs-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16334,14 +16707,17 @@ Unconditionally turn off `hs-minor-mode'." nil nil)
 (autoload 'highlight-changes-mode "hilit-chg" "\
 Toggle highlighting changes in this buffer (Highlight Changes mode).
 
-If called interactively, toggle `Highlight-Changes mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Highlight-Changes mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `highlight-changes-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16365,14 +16741,18 @@ buffer with the contents of a file
 (autoload 'highlight-changes-visible-mode "hilit-chg" "\
 Toggle visibility of highlighting due to Highlight Changes mode.
 
-If called interactively, toggle `Highlight-Changes-Visible mode'.  If
-the prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Highlight-Changes-Visible mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `highlight-changes-visible-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16503,7 +16883,7 @@ Construct a function similar to `hippie-expand'.
 Make it use the expansion functions in TRY-LIST.  An optional second
 argument VERBOSE non-nil makes the function verbose.
 
-\(fn TRY-LIST &optional VERBOSE)" nil t)
+\(fn TRY-LIST &optional VERBOSE)" nil nil)
 
 (register-definition-prefixes "hippie-exp" '("he-" "hippie-expand-" "try-"))
 
@@ -16515,14 +16895,17 @@ argument VERBOSE non-nil makes the function verbose.
 (autoload 'hl-line-mode "hl-line" "\
 Toggle highlighting of the current line (Hl-Line mode).
 
-If called interactively, toggle `Hl-Line mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Hl-Line
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `hl-line-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16551,14 +16934,17 @@ or call the function `global-hl-line-mode'.")
 (autoload 'global-hl-line-mode "hl-line" "\
 Toggle line highlighting in all buffers (Global Hl-Line mode).
 
-If called interactively, toggle `Global Hl-Line mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+Hl-Line mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-hl-line-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16969,14 +17355,17 @@ or call the function `fido-mode'.")
 (autoload 'fido-mode "icomplete" "\
 An enhanced `icomplete-mode' that emulates `ido-mode'.
 
-If called interactively, toggle `Fido mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Fido mode'
+mode.  If the prefix argument is positive, enable the mode, and if it
+is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'fido-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -16998,14 +17387,17 @@ or call the function `icomplete-mode'.")
 (autoload 'icomplete-mode "icomplete" "\
 Toggle incremental minibuffer completion (Icomplete mode).
 
-If called interactively, toggle `Icomplete mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Icomplete
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'icomplete-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -17023,12 +17415,45 @@ completions:
 \\{icomplete-minibuffer-map}
 
 \(fn &optional ARG)" t nil)
+
+(defvar icomplete-vertical-mode nil "\
+Non-nil if Icomplete-Vertical mode is enabled.
+See the `icomplete-vertical-mode' command
+for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `icomplete-vertical-mode'.")
+
+(custom-autoload 'icomplete-vertical-mode "icomplete" nil)
+
+(autoload 'icomplete-vertical-mode "icomplete" "\
+Toggle vertical candidate display in `icomplete-mode' or `fido-mode'.
+
+This is a minor mode.  If called interactively, toggle the
+`Icomplete-Vertical mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
+mode if ARG is nil, omitted, or is a positive number.  Disable the
+mode if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'icomplete-vertical-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+As many completion candidates as possible are displayed, depending on
+the value of `max-mini-window-height', and the way the mini-window is
+resized depends on `resize-mini-windows'.
+
+\(fn &optional ARG)" t nil)
 (when (locate-library "obsolete/iswitchb")
  (autoload 'iswitchb-mode "iswitchb" "Toggle Iswitchb mode." t)
  (make-obsolete 'iswitchb-mode
    "use `icomplete-mode' or `ido-mode' instead." "24.4"))
 
-(register-definition-prefixes "icomplete" '("icomplete-"))
+(register-definition-prefixes "icomplete" '("fido-vertical-mode" "icomplete-"))
 
 ;;;***
 
@@ -17546,14 +17971,17 @@ See `inferior-emacs-lisp-mode' for details.
 (autoload 'iimage-mode "iimage" "\
 Toggle Iimage mode on or off.
 
-If called interactively, toggle `Iimage mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Iimage
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `iimage-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -17670,12 +18098,16 @@ means display it in the right marginal area.
 (autoload 'insert-image "image" "\
 Insert IMAGE into current buffer at point.
 IMAGE is displayed by inserting STRING into the current buffer
-with a `display' property whose value is the image.  STRING
-defaults to a single space if you omit it.
+with a `display' property whose value is the image.
+
+STRING defaults to a single space if you omit it, which means
+that the inserted image will behave as whitespace syntactically.
+
 AREA is where to display the image.  AREA nil or omitted means
 display it in the text area, a value of `left-margin' means
 display it in the left marginal area, a value of `right-margin'
 means display it in the right marginal area.
+
 SLICE specifies slice of IMAGE to insert.  SLICE nil or omitted
 means insert whole image.  SLICE is a list (X Y WIDTH HEIGHT)
 specifying the X and Y positions and WIDTH and HEIGHT of image area
@@ -17862,14 +18294,17 @@ Setup easy-to-use keybindings for the commands to be 
used in dired mode.
 Note that n, p and <down> and <up> will be hijacked and bound to
 `image-dired-dired-x-line'.
 
-If called interactively, toggle `Image-Dired minor mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Image-Dired minor mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `image-dired-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -17964,14 +18399,17 @@ or call the function `auto-image-file-mode'.")
 (autoload 'auto-image-file-mode "image-file" "\
 Toggle visiting of image files as images (Auto Image File mode).
 
-If called interactively, toggle `Auto-Image-File mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Auto-Image-File mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'auto-image-file-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -17999,14 +18437,17 @@ Key bindings:
 (autoload 'image-minor-mode "image-mode" "\
 Toggle Image minor mode in this buffer.
 
-If called interactively, toggle `Image minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Image
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `image-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -18943,14 +19384,17 @@ available on the net." t nil)
 (autoload 'ispell-minor-mode "ispell" "\
 Toggle last-word spell checking (Ispell minor mode).
 
-If called interactively, toggle `ISpell minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `ISpell
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `ispell-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -19101,7 +19545,7 @@ It is not recommended to set this variable permanently 
to anything but nil.")
 Uninstall jka-compr.
 This removes the entries in `file-name-handler-alist' and `auto-mode-alist'
 and `inhibit-local-variables-suffixes' that were added
-by `jka-compr-installed'." nil nil)
+by `jka-compr-install'." nil nil)
 
 (register-definition-prefixes "jka-compr" '("compression-error" "jka-compr-"))
 
@@ -19266,12 +19710,12 @@ and the return value is the length of the conversion.
 
 ;;;### (autoloads nil "kmacro" "kmacro.el" (0 0 0 0))
 ;;; Generated autoloads from kmacro.el
- (global-set-key "\C-x(" 'kmacro-start-macro)
- (global-set-key "\C-x)" 'kmacro-end-macro)
- (global-set-key "\C-xe" 'kmacro-end-and-call-macro)
- (global-set-key [f3] 'kmacro-start-macro-or-insert-counter)
- (global-set-key [f4] 'kmacro-end-or-call-macro)
- (global-set-key "\C-x\C-k" 'kmacro-keymap)
+ (global-set-key "\C-x(" #'kmacro-start-macro)
+ (global-set-key "\C-x)" #'kmacro-end-macro)
+ (global-set-key "\C-xe" #'kmacro-end-and-call-macro)
+ (global-set-key [f3] #'kmacro-start-macro-or-insert-counter)
+ (global-set-key [f4] #'kmacro-end-or-call-macro)
+ (global-set-key "\C-x\C-k" #'kmacro-keymap)
  (autoload 'kmacro-keymap "kmacro" "Keymap for keyboard macro commands." t 
'keymap)
 
 (autoload 'kmacro-exec-ring-item "kmacro" "\
@@ -19638,14 +20082,17 @@ sleep in seconds.
 (autoload 'linum-mode "linum" "\
 Toggle display of line numbers in the left margin (Linum mode).
 
-If called interactively, toggle `Linum mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Linum
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `linum-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -19779,28 +20226,28 @@ except that FILTER is not optional.
 ;;; Generated autoloads from vc/log-edit.el
 
 (autoload 'log-edit "log-edit" "\
-Setup a buffer to enter a log message.
-The buffer is put in mode MODE or `log-edit-mode' if MODE is nil.
+Setup a buffer to enter a VC commit log message.
+The buffer is put in mode MODE, or `log-edit-mode' if MODE is nil.
 \\<log-edit-mode-map>
 If SETUP is non-nil, erase the buffer and run `log-edit-hook'.
 Set mark and point around the entire contents of the buffer, so
 that it is easy to kill the contents of the buffer with
-\\[kill-region].  Once the user is done editing the message,
-invoking the command \\[log-edit-done] (`log-edit-done') will
-call CALLBACK to do the actual commit.
+\\[kill-region].  Once the user is done editing the message, he
+or she is expected to invoke the command \\[log-edit-done] (`log-edit-done'),
+which will call CALLBACK, a function to do the actual commit.
 
-PARAMS if non-nil is an alist of variables and buffer-local
-values to give them in the Log Edit buffer.  Possible keys and
-associated values:
+PARAMS, if non-nil, is an alist of variables and buffer-local
+values to give to those variables in the Log Edit buffer.  Possible
+keys and associated values are:
  `log-edit-listfun' -- function taking no arguments that returns the list of
- files that are concerned by the current operation (using relative names);
+    files that are concerned by the current operation (using relative names);
  `log-edit-diff-function' -- function taking no arguments that
- displays a diff of the files concerned by the current operation.
+    displays a diff of the files concerned by the current operation.
  `vc-log-fileset' -- the VC fileset to be committed (if any).
 
-If BUFFER is non-nil `log-edit' will jump to that buffer, use it
+If BUFFER is non-nil, `log-edit' will switch to that buffer, use it
 to edit the log message and go back to the current buffer when
-done.  Otherwise, it uses the current buffer.
+done.  Otherwise, this function will use the current buffer.
 
 \(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil)
 
@@ -20216,14 +20663,17 @@ or call the function `mail-abbrevs-mode'.")
 (autoload 'mail-abbrevs-mode "mailabbrev" "\
 Toggle abbrev expansion of mail aliases (Mail Abbrevs mode).
 
-If called interactively, toggle `Mail-Abbrevs mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Mail-Abbrevs mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'mail-abbrevs-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -20340,6 +20790,50 @@ The mail client is taken to be the handler of mailto 
URLs." nil nil)
 ;;;### (autoloads nil "mairix" "net/mairix.el" (0 0 0 0))
 ;;; Generated autoloads from net/mairix.el
 
+(autoload 'mairix-search "mairix" "\
+Call Mairix with SEARCH.
+If THREADS is non-nil, also display whole threads of found
+messages.  Results will be put into the default search file.
+
+\(fn SEARCH THREADS)" t nil)
+
+(autoload 'mairix-use-saved-search "mairix" "\
+Use a saved search for querying Mairix." t nil)
+
+(autoload 'mairix-edit-saved-searches-customize "mairix" "\
+Edit the list of saved searches in a customization buffer." t nil)
+
+(autoload 'mairix-search-from-this-article "mairix" "\
+Search messages from sender of the current article.
+This is effectively a shortcut for calling `mairix-search' with
+f:current_from.  If prefix THREADS is non-nil, include whole
+threads.
+
+\(fn THREADS)" t nil)
+
+(autoload 'mairix-search-thread-this-article "mairix" "\
+Search thread for the current article.
+This is effectively a shortcut for calling `mairix-search'
+with m:msgid of the current article and enabled threads." t nil)
+
+(autoload 'mairix-widget-search-based-on-article "mairix" "\
+Create mairix query based on current article using widgets." t nil)
+
+(autoload 'mairix-edit-saved-searches "mairix" "\
+Edit current mairix searches." t nil)
+
+(autoload 'mairix-widget-search "mairix" "\
+Create mairix query interactively using graphical widgets.
+MVALUES may contain values from current article.
+
+\(fn &optional MVALUES)" t nil)
+
+(autoload 'mairix-update-database "mairix" "\
+Call mairix for updating the database for SERVERS.
+Mairix will be called asynchronously unless
+`mairix-synchronous-update' is t.  Mairix will be called with
+`mairix-update-options'." t nil)
+
 (register-definition-prefixes "mairix" '("mairix-"))
 
 ;;;***
@@ -20464,13 +20958,6 @@ An adapted `makefile-mode' that knows about imake.
 
 ;;;***
 
-;;;### (autoloads nil "makeinfo" "textmodes/makeinfo.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/makeinfo.el
-
-(register-definition-prefixes "makeinfo" '("makeinfo-"))
-
-;;;***
-
 ;;;### (autoloads nil "makesum" "makesum.el" (0 0 0 0))
 ;;; Generated autoloads from makesum.el
 
@@ -20558,14 +21045,17 @@ Default bookmark handler for Man buffers.
 (autoload 'master-mode "master" "\
 Toggle Master mode.
 
-If called interactively, toggle `Master mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Master
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `master-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -20600,14 +21090,18 @@ or call the function 
`minibuffer-depth-indicate-mode'.")
 (autoload 'minibuffer-depth-indicate-mode "mb-depth" "\
 Toggle Minibuffer Depth Indication mode.
 
-If called interactively, toggle `Minibuffer-Depth-Indicate mode'.  If
-the prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Minibuffer-Depth-Indicate mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'minibuffer-depth-indicate-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -20663,7 +21157,7 @@ OTHER-HEADERS is an alist of header/value pairs.  
CONTINUE says whether
 to continue editing a message already being composed.  SWITCH-FUNCTION
 is a function used to switch to and display the mail buffer.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest IGNORED)" t nil)
+\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest _)" t nil)
 
 (autoload 'message-news "message" "\
 Start editing a news article to be sent.
@@ -21165,14 +21659,17 @@ or call the function `midnight-mode'.")
 (autoload 'midnight-mode "midnight" "\
 Non-nil means run `midnight-hook' at midnight.
 
-If called interactively, toggle `Midnight mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Midnight
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'midnight-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -21217,14 +21714,18 @@ or call the function 
`minibuffer-electric-default-mode'.")
 (autoload 'minibuffer-electric-default-mode "minibuf-eldef" "\
 Toggle Minibuffer Electric Default mode.
 
-If called interactively, toggle `Minibuffer-Electric-Default mode'.
-If the prefix argument is positive, enable the mode, and if it is zero
-or negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Minibuffer-Electric-Default mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'minibuffer-electric-default-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -21354,6 +21855,9 @@ Sequence of files visited by multiple file buffers 
Isearch.")
 Set up isearch to search multiple buffers.
 Intended to be added to `isearch-mode-hook'." nil nil)
 
+(autoload 'multi-isearch-switch-buffer "misearch" "\
+Switch to the next buffer in multi-buffer search." nil nil)
+
 (autoload 'multi-isearch-buffers "misearch" "\
 Start multi-buffer Isearch on a list of BUFFERS.
 This list can contain live buffers or their names.
@@ -21795,14 +22299,17 @@ or call the function `msb-mode'.")
 (autoload 'msb-mode "msb" "\
 Toggle Msb mode.
 
-If called interactively, toggle `Msb mode'.  If the prefix argument is
-positive, enable the mode, and if it is zero or negative, disable the
-mode.
+This is a minor mode.  If called interactively, toggle the `Msb mode'
+mode.  If the prefix argument is positive, enable the mode, and if it
+is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'msb-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -22104,21 +22611,24 @@ See the `mouse-wheel-mode' command
 for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
-or call the function `mouse-wheel-mode'." :set #'custom-set-minor-mode 
:initialize 'custom-initialize-delay :group 'mouse :type 'boolean)
+or call the function `mouse-wheel-mode'." :set #'custom-set-minor-mode 
:initialize 'custom-initialize-delay :type 'boolean :group 'mouse)
 
 (custom-autoload 'mouse-wheel-mode "mwheel" nil)
 
 (autoload 'mouse-wheel-mode "mwheel" "\
 Toggle mouse wheel support (Mouse Wheel mode).
 
-If called interactively, toggle `Mouse-Wheel mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Mouse-Wheel mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'mouse-wheel-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -24079,19 +24589,22 @@ Turning on outline mode calls the value of 
`text-mode-hook' and then of
 
 \(fn)" t nil)
 (put 'outline-minor-mode-cycle 'safe-local-variable 'booleanp)
-(put 'outline-minor-mode-highlight 'safe-local-variable 'booleanp)
+(put 'outline-minor-mode-highlight 'safe-local-variable 'symbolp)
 
 (autoload 'outline-minor-mode "outline" "\
 Toggle Outline minor mode.
 
-If called interactively, toggle `Outline minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Outline
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `outline-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -24325,14 +24838,17 @@ or call the function `show-paren-mode'.")
 (autoload 'show-paren-mode "paren" "\
 Toggle visualization of matching parens (Show Paren mode).
 
-If called interactively, toggle `Show-Paren mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Show-Paren
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'show-paren-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -25038,14 +25554,17 @@ or call the function `pixel-scroll-mode'.")
 (autoload 'pixel-scroll-mode "pixel-scroll" "\
 A minor mode to scroll text pixel-by-pixel.
 
-If called interactively, toggle `Pixel-Scroll mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Pixel-Scroll mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'pixel-scroll-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -25148,14 +25667,14 @@ Macroexpand EXPRESSION and pretty-print its value.
 
 (autoload 'pp-eval-last-sexp "pp" "\
 Run `pp-eval-expression' on sexp before point.
-With argument, pretty-print output into current buffer.
+With ARG, pretty-print output into current buffer.
 Ignores leading comment characters.
 
 \(fn ARG)" t nil)
 
 (autoload 'pp-macroexpand-last-sexp "pp" "\
 Run `pp-macroexpand-expression' on sexp before point.
-With argument, pretty-print output into current buffer.
+With ARG, pretty-print output into current buffer.
 Ignores leading comment characters.
 
 \(fn ARG)" t nil)
@@ -25730,8 +26249,12 @@ Proced buffers.
 (autoload 'profiler-start "profiler" "\
 Start/restart profilers.
 MODE can be one of `cpu', `mem', or `cpu+mem'.
-If MODE is `cpu' or `cpu+mem', time-based profiler will be started.
-Also, if MODE is `mem' or `cpu+mem', then memory profiler will be started.
+If MODE is `cpu' or `cpu+mem', start the time-based profiler,
+   whereby CPU is sampled periodically using the SIGPROF signal.
+If MODE is `mem' or `cpu+mem', start profiler that samples CPU
+   whenever memory-allocation functions are called -- this is useful
+   if SIGPROF is not supported, or is unreliable, or is not sampling
+   at a high enough frequency.
 
 \(fn MODE)" t nil)
 
@@ -25756,7 +26279,7 @@ Open profile FILENAME.
 
 ;;;### (autoloads nil "project" "progmodes/project.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/project.el
-(push (purecopy '(project 0 5 4)) package--builtin-versions)
+(push (purecopy '(project 0 6 0)) package--builtin-versions)
 
 (autoload 'project-current "project" "\
 Return the project instance in DIRECTORY, defaulting to `default-directory'.
@@ -26802,14 +27325,17 @@ or call the function `rcirc-track-minor-mode'.")
 (autoload 'rcirc-track-minor-mode "rcirc" "\
 Global minor mode for tracking activity in rcirc buffers.
 
-If called interactively, toggle `Rcirc-Track minor mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Rcirc-Track minor mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'rcirc-track-minor-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -26832,7 +27358,12 @@ the regexp builder.  It displays a buffer named 
\"*RE-Builder*\"
 in another window, initially containing an empty regexp.
 
 As you edit the regexp in the \"*RE-Builder*\" buffer, the
-matching parts of the target buffer will be highlighted." t nil)
+matching parts of the target buffer will be highlighted.
+
+Case-sensitivity can be toggled with \\[reb-toggle-case].  The
+regexp builder supports three different forms of input which can
+be set with \\[reb-change-syntax].  More options and details are
+provided in the Commentary section of this library." t nil)
 
 (register-definition-prefixes "re-builder" '("re-builder-unload-function" 
"reb-"))
 
@@ -26854,14 +27385,17 @@ or call the function `recentf-mode'.")
 (autoload 'recentf-mode "recentf" "\
 Toggle \"Open Recent\" menu (Recentf mode).
 
-If called interactively, toggle `Recentf mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Recentf
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'recentf-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27019,14 +27553,17 @@ with a prefix argument, prompt for START-AT and 
FORMAT.
 (autoload 'rectangle-mark-mode "rect" "\
 Toggle the region as rectangular.
 
-If called interactively, toggle `Rectangle-Mark mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Rectangle-Mark mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `rectangle-mark-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27058,14 +27595,17 @@ Activates the region if needed.  Only lasts until the 
region is deactivated.
 (autoload 'refill-mode "refill" "\
 Toggle automatic refilling (Refill mode).
 
-If called interactively, toggle `Refill mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Refill
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `refill-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27095,14 +27635,17 @@ Turn on RefTeX mode." nil nil)
 (autoload 'reftex-mode "reftex" "\
 Minor mode with distinct support for \\label, \\ref and \\cite in LaTeX.
 
-If called interactively, toggle `Reftex mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Reftex
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `reftex-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27305,6 +27848,11 @@ recently executed command not bound to an input 
event\".
 
 \(fn REPEAT-ARG)" t nil)
 
+(defvar repeat-map nil "\
+The value of the repeating map for the next command.
+A command called from the map can set it again to the same map when
+the map can't be set on the command symbol property `repeat-map'.")
+
 (defvar repeat-mode nil "\
 Non-nil if Repeat mode is enabled.
 See the `repeat-mode' command
@@ -27320,20 +27868,23 @@ Toggle Repeat mode.
 When Repeat mode is enabled, and the command symbol has the property named
 `repeat-map', this map is activated temporarily for the next command.
 
-If called interactively, toggle `Repeat mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Repeat
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'repeat-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
 \(fn &optional ARG)" t nil)
 
-(register-definition-prefixes "repeat" '("repeat-"))
+(register-definition-prefixes "repeat" '("describe-repeat" "repeat-"))
 
 ;;;***
 
@@ -27391,8 +27942,10 @@ visible (if only part could otherwise be made so), to 
make the defun line
 visible (if point is in code and it could not be made so, or if only
 comments, including the first comment line, are visible), or to make the
 first comment line visible (if point is in a comment).
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage.
 
-\(fn &optional ARG)" t nil)
+\(fn &optional ARG INTERACTIVE)" t nil)
 
 (register-definition-prefixes "reposition" '("repos-count-screen-lines"))
 
@@ -27404,14 +27957,17 @@ first comment line visible (if point is in a comment).
 (autoload 'reveal-mode "reveal" "\
 Toggle uncloaking of invisible text near point (Reveal mode).
 
-If called interactively, toggle `Reveal mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Reveal
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `reveal-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27436,14 +27992,17 @@ or call the function `global-reveal-mode'.")
 Toggle Reveal mode in all buffers (Global Reveal mode).
 Reveal mode renders invisible text around point visible again.
 
-If called interactively, toggle `Global Reveal mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+Reveal mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-reveal-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -27845,28 +28404,37 @@ than appending to it.  Deletes the message after 
writing if
 ;;; Generated autoloads from emacs-lisp/rmc.el
 
 (autoload 'read-multiple-choice "rmc" "\
-Ask user a multiple choice question.
-PROMPT should be a string that will be displayed as the prompt.
-
-CHOICES is a list of (KEY NAME [DESCRIPTION]).  KEY is a
-character to be entered.  NAME is a short name for the entry to
-be displayed while prompting (if there's room, it might be
-shortened).  DESCRIPTION is an optional longer explanation that
-will be displayed in a help buffer if the user requests more
-help.
+Ask user to select an entry from CHOICES, promting with PROMPT.
+This function allows to ask the user a multiple-choice question.
+
+CHOICES should be a list of the form (KEY NAME [DESCRIPTION]).
+KEY is a character the user should type to select the entry.
+NAME is a short name for the entry to be displayed while prompting
+\(if there's no room, it might be shortened).
+DESCRIPTION is an optional longer description of the entry; it will
+be displayed in a help buffer if the user requests more help.  This
+help description has a fixed format in columns.  For greater
+flexibility, instead of passing a DESCRIPTION, the caller can pass
+the optional argument HELP-STRING.  This argument is a string that
+should contain a more detailed description of all of the possible
+choices.  `read-multiple-choice' will display that description in a
+help buffer if the user requests that.
 
 This function translates user input into responses by consulting
 the bindings in `query-replace-map'; see the documentation of
-that variable for more information.  In this case, the useful
-bindings are `recenter', `scroll-up', and `scroll-down'.  If the
-user enters `recenter', `scroll-up', or `scroll-down' responses,
-perform the requested window recentering or scrolling and ask
-again.
-
-When `use-dialog-box' is t (the default), this function can pop
-up a dialog window to collect the user input.  That functionality
-requires `display-popup-menus-p' to return t.  Otherwise, a
-text dialog will be used.
+that variable for more information.  The relevant bindings for the
+purposes of this function are `recenter', `scroll-up', `scroll-down',
+and `edit'.
+If the user types the `recenter', `scroll-up', or `scroll-down'
+responses, the function performs the requested window recentering or
+scrolling, and then asks the question again.  If the user enters `edit',
+the function starts a recursive edit.  When the user exit the recursive
+edit, the multiple-choice prompt gains focus again.
+
+When `use-dialog-box' is t (the default), and the command using this
+function was invoked via the mouse, this function pops up a GUI dialog
+to collect the user input, but only if Emacs is capable of using GUI
+dialogs.  Otherwise, the function will always use text-mode dialogs.
 
 The return value is the matching entry from the CHOICES list.
 
@@ -27877,7 +28445,7 @@ Usage example:
                         (?s \"session only\")
                         (?n \"no\")))
 
-\(fn PROMPT CHOICES)" nil nil)
+\(fn PROMPT CHOICES &optional HELP-STRING)" nil nil)
 
 ;;;***
 
@@ -27968,14 +28536,17 @@ Validation will be enabled if 
`rng-nxml-auto-validate-flag' is non-nil." t nil)
 (autoload 'rng-validate-mode "rng-valid" "\
 Minor mode performing continual validation against a RELAX NG schema.
 
-If called interactively, toggle `Rng-Validate mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Rng-Validate mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `rng-validate-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28125,14 +28696,17 @@ highlighting.
 (autoload 'rst-minor-mode "rst" "\
 Toggle ReST minor mode.
 
-If called interactively, toggle `Rst minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Rst minor
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `rst-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28181,14 +28755,17 @@ Use the command `ruler-mode' to change this 
variable.")
 (autoload 'ruler-mode "ruler-mode" "\
 Toggle display of ruler in header line (Ruler mode).
 
-If called interactively, toggle `Ruler mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Ruler
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `ruler-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28258,7 +28835,7 @@ unmatchable     Never match anything at all.
 CHARCLASS       Match a character from a character class.  One of:
  alpha, alphabetic, letter   Alphabetic characters (defined by Unicode).
  alnum, alphanumeric         Alphabetic or decimal digit chars (Unicode).
- digit numeric, num          0-9.
+ digit, numeric, num         0-9.
  xdigit, hex-digit, hex      0-9, A-F, a-f.
  cntrl, control              ASCII codes 0-31.
  blank                       Horizontal whitespace (Unicode).
@@ -28388,7 +28965,7 @@ For more details, see Info node `(elisp) Extending Rx'.
 
 (function-put 'rx-define 'lisp-indent-function 'defun)
 
-(eval-and-compile (defun rx--pcase-macroexpander (&rest regexps) "A pattern 
that matches strings against `rx' REGEXPS in sexp form.\nREGEXPS are 
interpreted as in `rx'.  The pattern matches any\nstring that is a match for 
REGEXPS, as if by `string-match'.\n\nIn addition to the usual `rx' syntax, 
REGEXPS can contain the\nfollowing constructs:\n\n  (let REF RX...)  binds the 
symbol REF to a submatch that matches\n                   the regular 
expressions RX.  REF is bound in\n             [...]
+(eval-and-compile (defun rx--pcase-macroexpander (&rest regexps) "A pattern 
that matches strings against `rx' REGEXPS in sexp form.\nREGEXPS are 
interpreted as in `rx'.  The pattern matches any\nstring that is a match for 
REGEXPS, as if by `string-match'.\n\nIn addition to the usual `rx' syntax, 
REGEXPS can contain the\nfollowing constructs:\n\n  (let REF RX...)  binds the 
symbol REF to a submatch that matches\n                   the regular 
expressions RX.  REF is bound in\n             [...]
 
 (define-symbol-prop 'rx--pcase-macroexpander 'edebug-form-spec 'nil)
 
@@ -28458,14 +29035,17 @@ or call the function `savehist-mode'.")
 (autoload 'savehist-mode "savehist" "\
 Toggle saving of minibuffer history (Savehist mode).
 
-If called interactively, toggle `Savehist mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Savehist
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'savehist-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28519,14 +29099,17 @@ Non-nil means automatically save place in each file.
 This means when you visit a file, point goes to the last place
 where it was when you previously visited the same file.
 
-If called interactively, toggle `Save-Place mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Save-Place
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'save-place-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28538,14 +29121,17 @@ If this mode is enabled, point is recorded when you 
kill the buffer
 or exit Emacs.  Visiting this file again will go to that position,
 even in a later Emacs session.
 
-If called interactively, toggle `Save-Place-Local mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Save-Place-Local mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `save-place-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28632,14 +29218,17 @@ or call the function `scroll-all-mode'.")
 (autoload 'scroll-all-mode "scroll-all" "\
 Toggle shared scrolling in same-frame windows (Scroll-All mode).
 
-If called interactively, toggle `Scroll-All mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Scroll-All
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'scroll-all-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28665,14 +29254,17 @@ one window apply to all visible windows in the same 
frame.
 (autoload 'scroll-lock-mode "scroll-lock" "\
 Buffer-local minor mode for pager-like scrolling.
 
-If called interactively, toggle `Scroll-Lock mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Scroll-Lock mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `scroll-lock-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -28741,14 +29333,17 @@ or call the function `semantic-mode'.")
 (autoload 'semantic-mode "semantic" "\
 Toggle parser features (Semantic mode).
 
-If called interactively, toggle `Semantic mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Semantic
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'semantic-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -29246,6 +29841,17 @@ Like `mail' command, but display mail buffer in 
another frame.
 ;;; Generated autoloads from emacs-lisp/seq.el
 (push (purecopy '(seq 2 22)) package--builtin-versions)
 
+(autoload 'seq-subseq "seq" "\
+Return the sequence of elements of SEQUENCE from START to END.
+END is exclusive.
+
+If END is omitted, it defaults to the length of the sequence.  If
+START or END is negative, it counts from the end.  Signal an
+error if START or END are outside of the sequence (i.e too large
+if positive or too small if negative).
+
+\(fn SEQUENCE START &optional END)" nil nil)
+
 (autoload 'seq-take "seq" "\
 Take the first N elements of SEQUENCE and return the result.
 The result is a sequence of the same type as SEQUENCE.
@@ -29313,12 +29919,24 @@ Equality is defined by TESTFN if non-nil or by 
`equal' if nil.
 
 \(fn SEQUENCE ELT &optional TESTFN)" nil nil)
 
+(autoload 'seq-uniq "seq" "\
+Return a list of the elements of SEQUENCE with duplicates removed.
+TESTFN is used to compare elements, or `equal' if TESTFN is nil.
+
+\(fn SEQUENCE &optional TESTFN)" nil nil)
+
 (autoload 'seq-intersection "seq" "\
 Return a list of the elements that appear in both SEQUENCE1 and SEQUENCE2.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.
 
 \(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
 
+(autoload 'seq-difference "seq" "\
+Return a list of the elements that appear in SEQUENCE1 but not in SEQUENCE2.
+Equality is defined by TESTFN if non-nil or by `equal' if nil.
+
+\(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
+
 (autoload 'seq-group-by "seq" "\
 Apply FUNCTION to each element of SEQUENCE.
 Separate the elements of SEQUENCE into an alist using the results as
@@ -29387,14 +30005,17 @@ or call the function `server-mode'.")
 (autoload 'server-mode "server" "\
 Toggle Server mode.
 
-If called interactively, toggle `Server mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Server
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'server-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -29426,7 +30047,7 @@ Major mode for Simple Emacs Spreadsheet.
 When you invoke SES in a new buffer, it is divided into cells
 that you can enter data into.  You can navigate the cells with
 the arrow keys and add more cells with the tab key.  The contents
-of these cells can be numbers, text, or Lisp expressions. (To
+of these cells can be numbers, text, or Lisp expressions.  (To
 enter text, enclose it in double quotes.)
 
 In an expression, you can use cell coordinates to refer to the
@@ -29740,7 +30361,7 @@ Pop to a buffer with short documentation summary for 
functions in GROUP.
 
 \(fn GROUP)" t nil)
 
-(register-definition-prefixes "shortdoc" '("alist" "buffer" 
"define-short-documentation-group" "file" "hash-table" "list" "number" 
"process" "regexp" "sequence" "shortdoc-" "string" "vector"))
+(register-definition-prefixes "shortdoc" '("alist" "buffer" 
"define-short-documentation-group" "file" "hash-table" "list" "number" 
"overlay" "process" "regexp" "sequence" "shortdoc-" "string" "vector"))
 
 ;;;***
 
@@ -29825,9 +30446,6 @@ Turning on Sieve mode runs `sieve-mode-hook'.
 Major mode for editing SIMULA code.
 \\{simula-mode-map}
 Variables controlling indentation style:
- `simula-tab-always-indent'
-    Non-nil means TAB in SIMULA mode should always reindent the current line,
-    regardless of where in the line point is when the TAB command is used.
  `simula-indent-level'
     Indentation of SIMULA statements with respect to containing block.
  `simula-substatement-offset'
@@ -30020,14 +30638,17 @@ buffer names.
 (autoload 'smerge-mode "smerge-mode" "\
 Minor mode to simplify editing output from the diff3 program.
 
-If called interactively, toggle `Smerge mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `SMerge
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `smerge-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -30153,14 +30774,17 @@ Open the so-long `customize' group." t nil)
 (autoload 'so-long-minor-mode "so-long" "\
 This is the minor mode equivalent of `so-long-mode'.
 
-If called interactively, toggle `So-Long minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `So-Long
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `so-long-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -30235,14 +30859,17 @@ or call the function `global-so-long-mode'.")
 (autoload 'global-so-long-mode "so-long" "\
 Toggle automated performance mitigations for files with long lines.
 
-If called interactively, toggle `Global So-Long mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+So-Long mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-so-long-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -31353,14 +31980,17 @@ or call the function `strokes-mode'.")
 (autoload 'strokes-mode "strokes" "\
 Toggle Strokes mode, a global minor mode.
 
-If called interactively, toggle `Strokes mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Strokes
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'strokes-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -31451,6 +32081,12 @@ Truncate STRING to LENGTH, replacing initial surplus 
with \"...\".
 
 \(fn STRING LENGTH)" nil nil)
 
+(autoload 'string-lines "subr-x" "\
+Split STRING into a list of lines.
+If OMIT-NULLS, empty lines will be removed from the results.
+
+\(fn STRING &optional OMIT-NULLS)" nil nil)
+
 (register-definition-prefixes "subr-x" '("and-let*" "hash-table-" "if-let*" 
"internal--" "named-let" "replace-region-contents" "string-" "thread-" 
"when-let*"))
 
 ;;;***
@@ -31463,14 +32099,17 @@ Truncate STRING to LENGTH, replacing initial surplus 
with \"...\".
 (autoload 'subword-mode "subword" "\
 Toggle subword movement and editing (Subword mode).
 
-If called interactively, toggle `Subword mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Subword
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `subword-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -31522,14 +32161,17 @@ See `subword-mode' for more information on Subword 
mode.
 (autoload 'superword-mode "subword" "\
 Toggle superword movement and editing (Superword mode).
 
-If called interactively, toggle `Superword mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Superword
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `superword-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -31627,14 +32269,17 @@ or call the function `gpm-mouse-mode'.")
 (autoload 'gpm-mouse-mode "t-mouse" "\
 Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
 
-If called interactively, toggle `Gpm-Mouse mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Gpm-Mouse
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'gpm-mouse-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -31658,14 +32303,17 @@ GPM.  This is due to limitations in GPM and the Linux 
kernel.
 (autoload 'tab-line-mode "tab-line" "\
 Toggle display of window tab line in the buffer.
 
-If called interactively, toggle `Tab-Line mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Tab-Line
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `tab-line-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -32072,14 +32720,17 @@ location is indicated by 
`table-word-continuation-char'.  This
 variable's value can be toggled by \\[table-fixed-width-mode] at
 run-time.
 
-If called interactively, toggle `Table-Fixed-Width mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Table-Fixed-Width mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `table-fixed-width-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -32965,14 +33616,6 @@ value of `texinfo-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "texnfo-upd" "textmodes/texnfo-upd.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from textmodes/texnfo-upd.el
-
-(register-definition-prefixes "texnfo-upd" '("texinfo-"))
-
-;;;***
-
 ;;;### (autoloads nil "text-property-search" 
"emacs-lisp/text-property-search.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/text-property-search.el
@@ -33260,14 +33903,17 @@ This function is meant to be used as a 
`post-self-insert-hook'." t nil)
 (autoload 'tildify-mode "tildify" "\
 Adds electric behavior to space character.
 
-If called interactively, toggle `Tildify mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Tildify
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `tildify-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -33315,14 +33961,17 @@ or call the function `display-time-mode'.")
 (autoload 'display-time-mode "time" "\
 Toggle display of time, load level, and mail flag in mode lines.
 
-If called interactively, toggle `Display-Time mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Display-Time mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'display-time-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -33490,7 +34139,7 @@ look like one of the following:
       Time-stamp: <>
       Time-stamp: \" \"
 The time stamp is written between the brackets or quotes:
-      Time-stamp: <2001-02-18 10:20:51 gildea>
+      Time-stamp: <2020-08-07 17:10:21 gildea>
 
 The time stamp is updated only if the variable
 `time-stamp-active' is non-nil.
@@ -33502,7 +34151,7 @@ The variables `time-stamp-pattern', 
`time-stamp-line-limit',
 
 (autoload 'time-stamp-toggle-active "time-stamp" "\
 Toggle `time-stamp-active', setting whether \\[time-stamp] updates a buffer.
-With ARG, turn time stamping on if and only if arg is positive.
+With ARG, turn time stamping on if and only if ARG is positive.
 
 \(fn &optional ARG)" t nil)
 
@@ -33922,6 +34571,8 @@ the output buffer or changing the window configuration.
 
 ;;;### (autoloads nil "tramp" "net/tramp.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp.el
+ (when (featurep 'tramp-compat)
+  (load "tramp-compat" 'noerror 'nomessage))
 
 (defvar tramp-mode t "\
 Whether Tramp is enabled.
@@ -33951,10 +34602,10 @@ match file names at root of the underlying local file 
system,
 like \"/sys\" or \"/C:\".")
 
 (defun tramp-autoload-file-name-handler (operation &rest args) "\
-Load Tramp file name handler, and perform OPERATION." 
(tramp-unload-file-name-handlers) (when tramp-mode (let ((default-directory 
temporary-file-directory)) (load "tramp" 'noerror 'nomessage))) (apply 
operation args))
+Load Tramp file name handler, and perform OPERATION." 
(tramp-unload-file-name-handlers) (when tramp-mode (let ((default-directory 
temporary-file-directory)) (when (bound-and-true-p tramp-archive-autoload) 
(load "tramp-archive" 'noerror 'nomessage)) (load "tramp" 'noerror 
'nomessage))) (apply operation args))
 
 (defun tramp-register-autoload-file-name-handlers nil "\
-Add Tramp file name handlers to `file-name-handler-alist' during autoload." 
(add-to-list 'file-name-handler-alist (cons tramp-autoload-file-name-regexp 
'tramp-autoload-file-name-handler)) (put #'tramp-autoload-file-name-handler 
'safe-magic t))
+Add Tramp file name handlers to `file-name-handler-alist' during autoload." 
(add-to-list 'file-name-handler-alist (cons tramp-autoload-file-name-regexp 
#'tramp-autoload-file-name-handler)) (put #'tramp-autoload-file-name-handler 
'safe-magic t))
  (tramp-register-autoload-file-name-handlers)
 
 (defun tramp-unload-file-name-handlers nil "\
@@ -33992,7 +34643,8 @@ It must be supported by libarchive(3).")
 (defmacro tramp-archive-autoload-file-name-regexp nil "\
 Regular expression matching archive file names." '(concat "\\`" "\\(" ".+" 
"\\." (regexp-opt tramp-archive-suffixes) "\\(?:" "\\." (regexp-opt 
tramp-archive-compression-suffixes) "\\)*" "\\)" "\\(" "/" ".*" "\\)" "\\'"))
 
-(defalias 'tramp-archive-autoload-file-name-handler 
#'tramp-autoload-file-name-handler)
+(defun tramp-archive-autoload-file-name-handler (operation &rest args) "\
+Load Tramp archive file name handler, and perform OPERATION." (when 
tramp-archive-enabled (let ((default-directory temporary-file-directory) 
(tramp-archive-autoload t)) tramp-archive-autoload (apply 
#'tramp-autoload-file-name-handler operation args))))
 
 (defun tramp-register-archive-file-name-handler nil "\
 Add archive file name handler to `file-name-handler-alist'." (when 
tramp-archive-enabled (add-to-list 'file-name-handler-alist (cons 
(tramp-archive-autoload-file-name-regexp) 
#'tramp-archive-autoload-file-name-handler)) (put 
#'tramp-archive-autoload-file-name-handler 'safe-magic t)))
@@ -34109,12 +34761,73 @@ Add archive file name handler to 
`file-name-handler-alist'." (when tramp-archive
 
 ;;;### (autoloads nil "trampver" "net/trampver.el" (0 0 0 0))
 ;;; Generated autoloads from net/trampver.el
-(push (purecopy '(tramp 2 5 1 -1)) package--builtin-versions)
+(push (purecopy '(tramp 2 5 1)) package--builtin-versions)
 
 (register-definition-prefixes "trampver" '("tramp-"))
 
 ;;;***
 
+;;;### (autoloads nil "transient" "transient.el" (0 0 0 0))
+;;; Generated autoloads from transient.el
+
+(autoload 'transient-insert-suffix "transient" "\
+Insert a SUFFIX into PREFIX before LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-insert-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-append-suffix "transient" "\
+Insert a SUFFIX into PREFIX after LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-append-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-replace-suffix "transient" "\
+Replace the suffix at LOC in PREFIX with SUFFIX.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-replace-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-remove-suffix "transient" "\
+Remove the suffix or group at LOC in PREFIX.
+PREFIX is a prefix command, a symbol.
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC)" nil nil)
+
+(function-put 'transient-remove-suffix 'lisp-indent-function 'defun)
+
+(register-definition-prefixes "transient" '("transient-"))
+
+;;;***
+
 ;;;### (autoloads nil "tree-widget" "tree-widget.el" (0 0 0 0))
 ;;; Generated autoloads from tree-widget.el
 
@@ -34178,11 +34891,13 @@ first and the associated buffer to its right.
 \(fn &optional BUFFER)" t nil)
 
 (autoload '2C-associate-buffer "two-column" "\
-Associate another buffer with this one in two-column minor mode.
+Associate another BUFFER with this one in two-column minor mode.
 Can also be used to associate a just previously visited file, by
 accepting the proposed default buffer.
 
-\(See  \\[describe-mode] .)" t nil)
+\(See  \\[describe-mode] .)
+
+\(fn BUFFER)" t nil)
 
 (autoload '2C-split "two-column" "\
 Split a two-column text at point, into two buffers in two-column minor mode.
@@ -34225,14 +34940,17 @@ or call the function `type-break-mode'.")
 Enable or disable typing-break mode.
 This is a minor mode, but it is global to all buffers by default.
 
-If called interactively, toggle `Type-Break mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Type-Break
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'type-break-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -34665,7 +35383,7 @@ added to this list, so most requests can just pass in 
nil.
 
 \(fn URL)" nil nil)
 
-(register-definition-prefixes "url-dav" '("url-"))
+(register-definition-prefixes "url-dav" '("url-dav-"))
 
 ;;;***
 
@@ -34756,14 +35474,17 @@ or call the function `url-handler-mode'.")
 (autoload 'url-handler-mode "url-handlers" "\
 Toggle using `url' library for URL filenames (URL Handler mode).
 
-If called interactively, toggle `Url-Handler mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Url-Handler mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'url-handler-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -36062,7 +36783,7 @@ Key bindings:
 ;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/verilog-mode.el
-(push (purecopy '(verilog-mode 2021 3 30 243771231)) package--builtin-versions)
+(push (purecopy '(verilog-mode 2021 4 12 188864585)) package--builtin-versions)
 
 (autoload 'verilog-mode "verilog-mode" "\
 Major mode for editing Verilog code.
@@ -36936,14 +37657,17 @@ own View-like bindings.
 (autoload 'view-mode "view" "\
 Toggle View mode, a minor mode for viewing text but not editing it.
 
-If called interactively, toggle `View mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `View mode'
+mode.  If the prefix argument is positive, enable the mode, and if it
+is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `view-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37315,14 +38039,17 @@ or call the function `which-function-mode'.")
 (autoload 'which-function-mode "which-func" "\
 Toggle mode line display of current function (Which Function mode).
 
-If called interactively, toggle `Which-Function mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Which-Function mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'which-function-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37343,14 +38070,17 @@ in certain major modes.
 (autoload 'whitespace-mode "whitespace" "\
 Toggle whitespace visualization (Whitespace mode).
 
-If called interactively, toggle `Whitespace mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Whitespace
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `whitespace-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37362,14 +38092,17 @@ See also `whitespace-style', `whitespace-newline' and
 (autoload 'whitespace-newline-mode "whitespace" "\
 Toggle newline visualization (Whitespace Newline mode).
 
-If called interactively, toggle `Whitespace-Newline mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Whitespace-Newline mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `whitespace-newline-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37395,14 +38128,17 @@ or call the function `global-whitespace-mode'.")
 (autoload 'global-whitespace-mode "whitespace" "\
 Toggle whitespace visualization globally (Global Whitespace mode).
 
-If called interactively, toggle `Global Whitespace mode'.  If the
-prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+Whitespace mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-whitespace-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37424,14 +38160,17 @@ or call the function 
`global-whitespace-newline-mode'.")
 (autoload 'global-whitespace-newline-mode "whitespace" "\
 Toggle global newline visualization (Global Whitespace Newline mode).
 
-If called interactively, toggle `Global Whitespace-Newline mode'.  If
-the prefix argument is positive, enable the mode, and if it is zero or
-negative, disable the mode.
+This is a minor mode.  If called interactively, toggle the `Global
+Whitespace-Newline mode' mode.  If the prefix argument is positive,
+enable the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'global-whitespace-newline-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37754,14 +38493,17 @@ Show widget browser for WIDGET in other window.
 (autoload 'widget-minor-mode "wid-browse" "\
 Minor mode for traversing widgets.
 
-If called interactively, toggle `Widget minor mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the `Widget
+minor mode' mode.  If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `widget-minor-mode'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -37864,31 +38606,37 @@ unless `windmove-create-window' is non-nil and a new 
window is created.
 Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'.
 
 \(fn &optional MODIFIERS)" t nil)
 
 (autoload 'windmove-display-left "windmove" "\
 Display the next buffer in window to the left of the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'.
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'.
 
 \(fn &optional ARG)" t nil)
 
 (autoload 'windmove-display-up "windmove" "\
 Display the next buffer in window above the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'.
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'.
 
 \(fn &optional ARG)" t nil)
 
 (autoload 'windmove-display-right "windmove" "\
 Display the next buffer in window to the right of the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'.
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'.
 
 \(fn &optional ARG)" t nil)
 
 (autoload 'windmove-display-down "windmove" "\
 Display the next buffer in window below the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'.
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'.
 
 \(fn &optional ARG)" t nil)
 
@@ -37912,6 +38660,8 @@ Set up keybindings for directional buffer display.
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'.
 
 \(fn &optional MODIFIERS)" t nil)
@@ -37949,7 +38699,10 @@ Set up keybindings for directional window deletion.
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'.
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'.
 
 \(fn &optional PREFIX MODIFIERS)" t nil)
 
@@ -37970,7 +38723,10 @@ Set up keybindings for directional window swap states.
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'.
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'.
 
 \(fn &optional MODIFIERS)" t nil)
 
@@ -37994,14 +38750,17 @@ or call the function `winner-mode'.")
 (autoload 'winner-mode "winner" "\
 Toggle Winner mode on or off.
 
-If called interactively, toggle `Winner mode'.  If the prefix argument
-is positive, enable the mode, and if it is zero or negative, disable
-the mode.
+This is a minor mode.  If called interactively, toggle the `Winner
+mode' mode.  If the prefix argument is positive, enable the mode, and
+if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'winner-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -38166,7 +38925,7 @@ If LIMIT is non-nil, then do not consider characters 
beyond LIMIT.
 
 ;;;### (autoloads nil "xref" "progmodes/xref.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/xref.el
-(push (purecopy '(xref 1 0 4)) package--builtin-versions)
+(push (purecopy '(xref 1 1 0)) package--builtin-versions)
 
 (autoload 'xref-find-backend "xref" nil nil nil)
 
@@ -38286,14 +39045,17 @@ or call the function `xterm-mouse-mode'.")
 (autoload 'xterm-mouse-mode "xt-mouse" "\
 Toggle XTerm mouse mode.
 
-If called interactively, toggle `Xterm-Mouse mode'.  If the prefix
-argument is positive, enable the mode, and if it is zero or negative,
-disable the mode.
+This is a minor mode.  If called interactively, toggle the
+`Xterm-Mouse mode' mode.  If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
 
 If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
 mode if ARG is nil, omitted, or is a positive number.  Disable the
 mode if ARG is a negative number.
 
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value 'xterm-mouse-mode)'.
+
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
 
@@ -38377,14 +39139,15 @@ Zone out, completely." t nil)
 ;;;;;;  "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
 ;;;;;;  "cedet/semantic/dep.el" "cedet/semantic/doc.el" 
"cedet/semantic/edit.el"
 ;;;;;;  "cedet/semantic/find.el" "cedet/semantic/format.el" 
"cedet/semantic/grammar-wy.el"
-;;;;;;  "cedet/semantic/html.el" "cedet/semantic/ia-sb.el" 
"cedet/semantic/ia.el"
-;;;;;;  "cedet/semantic/idle.el" "cedet/semantic/imenu.el" 
"cedet/semantic/lex-spp.el"
-;;;;;;  "cedet/semantic/lex.el" "cedet/semantic/mru-bookmark.el"
-;;;;;;  "cedet/semantic/scope.el" "cedet/semantic/senator.el" 
"cedet/semantic/sort.el"
-;;;;;;  "cedet/semantic/symref.el" "cedet/semantic/symref/cscope.el"
-;;;;;;  "cedet/semantic/symref/global.el" "cedet/semantic/symref/grep.el"
-;;;;;;  "cedet/semantic/symref/idutils.el" "cedet/semantic/symref/list.el"
-;;;;;;  "cedet/semantic/tag-file.el" "cedet/semantic/tag-ls.el" 
"cedet/semantic/tag-write.el"
+;;;;;;  "cedet/semantic/grm-wy-boot.el" "cedet/semantic/html.el"
+;;;;;;  "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el" 
"cedet/semantic/idle.el"
+;;;;;;  "cedet/semantic/imenu.el" "cedet/semantic/lex-spp.el" 
"cedet/semantic/lex.el"
+;;;;;;  "cedet/semantic/mru-bookmark.el" "cedet/semantic/scope.el"
+;;;;;;  "cedet/semantic/senator.el" "cedet/semantic/sort.el" 
"cedet/semantic/symref.el"
+;;;;;;  "cedet/semantic/symref/cscope.el" "cedet/semantic/symref/global.el"
+;;;;;;  "cedet/semantic/symref/grep.el" "cedet/semantic/symref/idutils.el"
+;;;;;;  "cedet/semantic/symref/list.el" "cedet/semantic/tag-file.el"
+;;;;;;  "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
 ;;;;;;  "cedet/semantic/tag.el" "cedet/semantic/texi.el" 
"cedet/semantic/util-modes.el"
 ;;;;;;  "cedet/semantic/wisent/java-tags.el" 
"cedet/semantic/wisent/javascript.el"
 ;;;;;;  "cedet/semantic/wisent/javat-wy.el" "cedet/semantic/wisent/js-wy.el"
@@ -38418,72 +39181,64 @@ Zone out, completely." t nil)
 ;;;;;;  "eshell/em-term.el" "eshell/em-tramp.el" "eshell/em-unix.el"
 ;;;;;;  "eshell/em-xtra.el" "faces.el" "files.el" "font-core.el"
 ;;;;;;  "font-lock.el" "format.el" "frame.el" "help.el" "hfy-cmap.el"
-;;;;;;  "ibuf-ext.el" "indent.el" "international/characters.el" 
"international/charprop.el"
-;;;;;;  "international/charscript.el" "international/cp51932.el"
-;;;;;;  "international/eucjp-ms.el" "international/iso-transl.el"
+;;;;;;  "ibuf-ext.el" "indent.el" "international/characters.el" 
"international/charscript.el"
+;;;;;;  "international/cp51932.el" "international/eucjp-ms.el" 
"international/iso-transl.el"
 ;;;;;;  "international/mule-cmds.el" "international/mule-conf.el"
-;;;;;;  "international/mule.el" "international/uni-bidi.el" 
"international/uni-brackets.el"
-;;;;;;  "international/uni-category.el" "international/uni-combining.el"
-;;;;;;  "international/uni-comment.el" "international/uni-decimal.el"
-;;;;;;  "international/uni-decomposition.el" "international/uni-digit.el"
-;;;;;;  "international/uni-lowercase.el" "international/uni-mirrored.el"
-;;;;;;  "international/uni-name.el" "international/uni-numeric.el"
-;;;;;;  "international/uni-old-name.el" 
"international/uni-special-lowercase.el"
-;;;;;;  "international/uni-special-titlecase.el" 
"international/uni-special-uppercase.el"
-;;;;;;  "international/uni-titlecase.el" "international/uni-uppercase.el"
-;;;;;;  "isearch.el" "jit-lock.el" "jka-cmpr-hook.el" "language/burmese.el"
-;;;;;;  "language/cham.el" "language/chinese.el" "language/cyrillic.el"
-;;;;;;  "language/czech.el" "language/english.el" "language/ethiopic.el"
-;;;;;;  "language/european.el" "language/georgian.el" "language/greek.el"
-;;;;;;  "language/hebrew.el" "language/indian.el" "language/japanese.el"
-;;;;;;  "language/khmer.el" "language/korean.el" "language/lao.el"
-;;;;;;  "language/misc-lang.el" "language/romanian.el" "language/sinhala.el"
-;;;;;;  "language/slovak.el" "language/tai-viet.el" "language/thai.el"
-;;;;;;  "language/tibetan.el" "language/utf-8-lang.el" "language/vietnamese.el"
-;;;;;;  "ldefs-boot.el" "leim/ja-dic/ja-dic.el" "leim/leim-list.el"
-;;;;;;  "leim/quail/4Corner.el" "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el"
-;;;;;;  "leim/quail/CTLau-b5.el" "leim/quail/CTLau.el" "leim/quail/ECDICT.el"
-;;;;;;  "leim/quail/ETZY.el" "leim/quail/PY-b5.el" "leim/quail/PY.el"
-;;;;;;  "leim/quail/Punct-b5.el" "leim/quail/Punct.el" "leim/quail/QJ-b5.el"
-;;;;;;  "leim/quail/QJ.el" "leim/quail/SW.el" "leim/quail/TONEPY.el"
-;;;;;;  "leim/quail/ZIRANMA.el" "leim/quail/ZOZY.el" "leim/quail/arabic.el"
-;;;;;;  "leim/quail/cham.el" "leim/quail/compose.el" "leim/quail/croatian.el"
-;;;;;;  "leim/quail/cyril-jis.el" "leim/quail/cyrillic.el" 
"leim/quail/czech.el"
-;;;;;;  "leim/quail/georgian.el" "leim/quail/greek.el" 
"leim/quail/hanja-jis.el"
-;;;;;;  "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el"
-;;;;;;  "leim/quail/ipa-praat.el" "leim/quail/latin-alt.el" 
"leim/quail/latin-ltx.el"
-;;;;;;  "leim/quail/latin-post.el" "leim/quail/latin-pre.el" 
"leim/quail/persian.el"
-;;;;;;  "leim/quail/programmer-dvorak.el" "leim/quail/py-punct.el"
-;;;;;;  "leim/quail/pypunct-b5.el" "leim/quail/quick-b5.el" 
"leim/quail/quick-cns.el"
-;;;;;;  "leim/quail/rfc1345.el" "leim/quail/sami.el" "leim/quail/sgml-input.el"
-;;;;;;  "leim/quail/slovak.el" "leim/quail/symbol-ksc.el" 
"leim/quail/tamil-dvorak.el"
-;;;;;;  "leim/quail/tsang-b5.el" "leim/quail/tsang-cns.el" 
"leim/quail/vntelex.el"
-;;;;;;  "leim/quail/vnvni.el" "leim/quail/welsh.el" "loadup.el" 
"mail/blessmail.el"
-;;;;;;  "mail/rmailedit.el" "mail/rmailkwd.el" "mail/rmailmm.el"
-;;;;;;  "mail/rmailmsc.el" "mail/rmailsort.el" "mail/rmailsum.el"
-;;;;;;  "mail/undigest.el" "menu-bar.el" "mh-e/mh-gnus.el" 
"mh-e/mh-loaddefs.el"
-;;;;;;  "minibuffer.el" "mouse.el" "net/tramp-loaddefs.el" "newcomment.el"
-;;;;;;  "obarray.el" "org/ob-core.el" "org/ob-lob.el" "org/ob-matlab.el"
-;;;;;;  "org/ob-tangle.el" "org/ob.el" "org/ol-bbdb.el" "org/ol-irc.el"
-;;;;;;  "org/ol.el" "org/org-archive.el" "org/org-attach.el" "org/org-clock.el"
-;;;;;;  "org/org-colview.el" "org/org-compat.el" "org/org-datetree.el"
-;;;;;;  "org/org-duration.el" "org/org-element.el" "org/org-feed.el"
-;;;;;;  "org/org-footnote.el" "org/org-goto.el" "org/org-id.el" 
"org/org-indent.el"
-;;;;;;  "org/org-install.el" "org/org-keys.el" "org/org-lint.el"
-;;;;;;  "org/org-list.el" "org/org-macs.el" "org/org-mobile.el" 
"org/org-num.el"
-;;;;;;  "org/org-plot.el" "org/org-refile.el" "org/org-table.el"
-;;;;;;  "org/org-timer.el" "org/ox-ascii.el" "org/ox-beamer.el" 
"org/ox-html.el"
-;;;;;;  "org/ox-icalendar.el" "org/ox-latex.el" "org/ox-md.el" "org/ox-odt.el"
-;;;;;;  "org/ox-org.el" "org/ox-publish.el" "org/ox-texinfo.el" "org/ox.el"
-;;;;;;  "progmodes/elisp-mode.el" "progmodes/prog-mode.el" "ps-mule.el"
-;;;;;;  "register.el" "replace.el" "rfn-eshadow.el" "select.el" "simple.el"
-;;;;;;  "startup.el" "subdirs.el" "subr.el" "tab-bar.el" "textmodes/fill.el"
+;;;;;;  "international/mule.el" "isearch.el" "jit-lock.el" "jka-cmpr-hook.el"
+;;;;;;  "language/burmese.el" "language/cham.el" "language/chinese.el"
+;;;;;;  "language/cyrillic.el" "language/czech.el" "language/english.el"
+;;;;;;  "language/ethiopic.el" "language/european.el" "language/georgian.el"
+;;;;;;  "language/greek.el" "language/hebrew.el" "language/indian.el"
+;;;;;;  "language/japanese.el" "language/khmer.el" "language/korean.el"
+;;;;;;  "language/lao.el" "language/misc-lang.el" "language/romanian.el"
+;;;;;;  "language/sinhala.el" "language/slovak.el" "language/tai-viet.el"
+;;;;;;  "language/thai.el" "language/tibetan.el" "language/utf-8-lang.el"
+;;;;;;  "language/vietnamese.el" "ldefs-boot.el" "leim/ja-dic/ja-dic.el"
+;;;;;;  "leim/leim-list.el" "leim/quail/4Corner.el" "leim/quail/ARRAY30.el"
+;;;;;;  "leim/quail/CCDOSPY.el" "leim/quail/CTLau-b5.el" "leim/quail/CTLau.el"
+;;;;;;  "leim/quail/ECDICT.el" "leim/quail/ETZY.el" "leim/quail/PY-b5.el"
+;;;;;;  "leim/quail/PY.el" "leim/quail/Punct-b5.el" "leim/quail/Punct.el"
+;;;;;;  "leim/quail/QJ-b5.el" "leim/quail/QJ.el" "leim/quail/SW.el"
+;;;;;;  "leim/quail/TONEPY.el" "leim/quail/ZIRANMA.el" "leim/quail/ZOZY.el"
+;;;;;;  "leim/quail/arabic.el" "leim/quail/cham.el" "leim/quail/compose.el"
+;;;;;;  "leim/quail/croatian.el" "leim/quail/cyril-jis.el" 
"leim/quail/cyrillic.el"
+;;;;;;  "leim/quail/czech.el" "leim/quail/georgian.el" "leim/quail/greek.el"
+;;;;;;  "leim/quail/hanja-jis.el" "leim/quail/hanja.el" "leim/quail/hanja3.el"
+;;;;;;  "leim/quail/hebrew.el" "leim/quail/ipa-praat.el" 
"leim/quail/latin-alt.el"
+;;;;;;  "leim/quail/latin-ltx.el" "leim/quail/latin-post.el" 
"leim/quail/latin-pre.el"
+;;;;;;  "leim/quail/persian.el" "leim/quail/programmer-dvorak.el"
+;;;;;;  "leim/quail/py-punct.el" "leim/quail/pypunct-b5.el" 
"leim/quail/quick-b5.el"
+;;;;;;  "leim/quail/quick-cns.el" "leim/quail/rfc1345.el" "leim/quail/sami.el"
+;;;;;;  "leim/quail/sgml-input.el" "leim/quail/slovak.el" 
"leim/quail/symbol-ksc.el"
+;;;;;;  "leim/quail/tamil-dvorak.el" "leim/quail/tsang-b5.el" 
"leim/quail/tsang-cns.el"
+;;;;;;  "leim/quail/vntelex.el" "leim/quail/vnvni.el" "leim/quail/welsh.el"
+;;;;;;  "loadup.el" "mail/blessmail.el" "mail/rmailedit.el" "mail/rmailkwd.el"
+;;;;;;  "mail/rmailmm.el" "mail/rmailmsc.el" "mail/rmailsort.el"
+;;;;;;  "mail/rmailsum.el" "mail/undigest.el" "menu-bar.el" "mh-e/mh-gnus.el"
+;;;;;;  "mh-e/mh-loaddefs.el" "minibuffer.el" "mouse.el" 
"net/tramp-loaddefs.el"
+;;;;;;  "newcomment.el" "obarray.el" "org/ob-core.el" "org/ob-lob.el"
+;;;;;;  "org/ob-matlab.el" "org/ob-tangle.el" "org/ob.el" "org/ol-bbdb.el"
+;;;;;;  "org/ol-irc.el" "org/ol.el" "org/org-archive.el" "org/org-attach.el"
+;;;;;;  "org/org-clock.el" "org/org-colview.el" "org/org-compat.el"
+;;;;;;  "org/org-datetree.el" "org/org-duration.el" "org/org-element.el"
+;;;;;;  "org/org-feed.el" "org/org-footnote.el" "org/org-goto.el"
+;;;;;;  "org/org-id.el" "org/org-indent.el" "org/org-install.el"
+;;;;;;  "org/org-keys.el" "org/org-lint.el" "org/org-list.el" "org/org-macs.el"
+;;;;;;  "org/org-mobile.el" "org/org-num.el" "org/org-plot.el" 
"org/org-refile.el"
+;;;;;;  "org/org-table.el" "org/org-timer.el" "org/ox-ascii.el" 
"org/ox-beamer.el"
+;;;;;;  "org/ox-html.el" "org/ox-icalendar.el" "org/ox-latex.el"
+;;;;;;  "org/ox-md.el" "org/ox-odt.el" "org/ox-org.el" "org/ox-publish.el"
+;;;;;;  "org/ox-texinfo.el" "org/ox.el" "progmodes/elisp-mode.el"
+;;;;;;  "progmodes/prog-mode.el" "ps-mule.el" "register.el" "replace.el"
+;;;;;;  "rfn-eshadow.el" "select.el" "simple.el" "startup.el" "subdirs.el"
+;;;;;;  "subr.el" "tab-bar.el" "textmodes/fill.el" "textmodes/makeinfo.el"
 ;;;;;;  "textmodes/page.el" "textmodes/paragraphs.el" "textmodes/reftex-auc.el"
 ;;;;;;  "textmodes/reftex-cite.el" "textmodes/reftex-dcr.el" 
"textmodes/reftex-global.el"
 ;;;;;;  "textmodes/reftex-index.el" "textmodes/reftex-parse.el" 
"textmodes/reftex-ref.el"
-;;;;;;  "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" 
"textmodes/text-mode.el"
-;;;;;;  "uniquify.el" "vc/ediff-hook.el" "vc/vc-hooks.el" "version.el"
-;;;;;;  "widget.el" "window.el") (0 0 0 0))
+;;;;;;  "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" 
"textmodes/texnfo-upd.el"
+;;;;;;  "textmodes/text-mode.el" "uniquify.el" "vc/ediff-hook.el"
+;;;;;;  "vc/vc-hooks.el" "version.el" "widget.el" "window.el") (0
+;;;;;;  0 0 0))
 
 ;;;***
 
diff --git a/lisp/leim/quail/latin-ltx.el b/lisp/leim/quail/latin-ltx.el
index 8b1e520..2146304 100644
--- a/lisp/leim/quail/latin-ltx.el
+++ b/lisp/leim/quail/latin-ltx.el
@@ -279,13 +279,17 @@ system, including many technical ones.  Examples:
  ("\\Vdash" ?⊩)
  ("\\Vert" ?‖)
  ("\\Vvdash" ?⊪)
+ ("\\above" ?┴)
  ("\\aleph" ?ℵ)
  ("\\amalg" ?∐)
  ("\\angle" ?∠)
+ ("\\aoint" ?∳)
  ("\\approx" ?≈)
  ("\\approxeq" ?≊)
+ ("\\asmash" ?⬆)
  ("\\ast" ?∗)
  ("\\asymp" ?≍)
+ ("\\atop" ?¦)
  ("\\backcong" ?≌)
  ("\\backepsilon" ?∍)
  ("\\backprime" ?‵)
@@ -294,11 +298,18 @@ system, including many technical ones.  Examples:
  ("\\backslash" ?\\)
  ("\\barwedge" ?⊼)
  ("\\because" ?∵)
+ ("\\begin" ?\〖)
+ ("\\below" ?┬)
  ("\\beth" ?ℶ)
  ("\\between" ?≬)
  ("\\bigcap" ?⋂)
  ("\\bigcirc" ?◯)
  ("\\bigcup" ?⋃)
+ ("\\bigodot" ?⨀)
+ ("\\bigoplus" ?⨁)
+ ("\\bigotimes" ?⨂)
+ ("\\bigsqcup" ?⨆)
+ ("\\biguplus" ?⨄)
  ("\\bigstar" ?★)
  ("\\bigtriangledown" ?▽)
  ("\\bigtriangleup" ?△)
@@ -315,6 +326,7 @@ system, including many technical ones.  Examples:
  ("\\boxminus" ?⊟)
  ("\\boxplus" ?⊞)
  ("\\boxtimes" ?⊠)
+ ("\\bra" ?\⟨)
  ("\\bullet" ?•)
  ("\\bumpeq" ?≏)
  ("\\cap" ?∩)
@@ -331,7 +343,9 @@ system, including many technical ones.  Examples:
  ("\\circledast" ?⊛)
  ("\\circledcirc" ?⊚)
  ("\\circleddash" ?⊝)
+ ("\\close" ?┤)
  ("\\clubsuit" ?♣)
+ ("\\coint" ?∲)
  ("\\coloneq" ?≔)
  ("\\complement" ?∁)
  ("\\cong" ?≅)
@@ -349,8 +363,12 @@ system, including many technical ones.  Examples:
  ("\\dagger" ?†)
  ("\\daleth" ?ℸ)
  ("\\dashv" ?⊣)
+ ("\\Dd" ?ⅅ)
+ ("\\dd" ?ⅆ)
  ("\\ddag" ?‡)
  ("\\ddagger" ?‡)
+ ("\\ddddot" ?⃜)
+ ("\\dddot" ?⃛)
  ("\\ddots" ?⋱)
  ("\\diamond" ?⋄)
  ("\\diamondsuit" ?♢)
@@ -363,8 +381,12 @@ system, including many technical ones.  Examples:
  ("\\downdownarrows" ?⇊)
  ("\\downleftharpoon" ?⇃)
  ("\\downrightharpoon" ?⇂)
+ ("\\dsmash" ?⬇)
+ ("\\ee" ?ⅇ)
  ("\\ell" ?ℓ)
  ("\\emptyset" ?∅)
+ ("\\end" ?\〗)
+ ("\\eqarray" ?█)
  ("\\eqcirc" ?≖)
  ("\\eqcolon" ?≕)
  ("\\eqslantgtr" ?⋝)
@@ -414,16 +436,25 @@ system, including many technical ones.  Examples:
  ("\\heartsuit" ?♥)
  ("\\hookleftarrow" ?↩)
  ("\\hookrightarrow" ?↪)
+ ("\\hphantom" ?⬄)
+ ("\\hsmash" ?⬌)
  ("\\iff" ?⇔)
+ ("\\ii" ?ⅈ)
+ ("\\iiiint" ?⨌)
+ ("\\iiint" ?∭)
+ ("\\iint" ?∬)
  ("\\imath" ?ı)
  ("\\in" ?∈)
  ("\\infty" ?∞)
  ("\\int" ?∫)
  ("\\intercal" ?⊺)
+ ("\\jj" ?ⅉ)
+ ("\\jmath" ?ȷ)
  ("\\langle" ?⟨) ;; Was ?〈, see bug#12948.
  ("\\lbrace" ?{)
  ("\\lbrack" ?\[)
  ("\\lceil" ?⌈)
+ ("\\ldiv" ?∕)
  ("\\ldots" ?…)
  ("\\le" ?≤)
  ("\\leadsto" ?↝)
@@ -529,16 +560,25 @@ system, including many technical ones.  Examples:
  ("\\nvdash" ?⊬)
  ("\\nwarrow" ?↖)
  ("\\odot" ?⊙)
+ ("\\oiiint" ?∰)
+ ("\\oiint" ?∯)
  ("\\oint" ?∮)
  ("\\ominus" ?⊖)
  ("\\oplus" ?⊕)
  ("\\oslash" ?⊘)
  ("\\otimes" ?⊗)
+ ("\\overbrace" ?⏞)
+ ("\\overparen" ?⏜)
  ("\\par" ?
)
  ("\\parallel" ?∥)
  ("\\partial" ?∂)
  ("\\perp" ?⊥)
+ ("\\phantom" ?⟡)
  ("\\pitchfork" ?⋔)
+ ("\\pppprime" ?⁗)
+ ("\\ppprime" ?‴)
+ ("\\pprime" ?″)
+ ("\\prcue" ?≼)
  ("\\prec" ?≺)
  ("\\precapprox" ?≾)
  ("\\preceq" ?≼)
@@ -548,12 +588,16 @@ system, including many technical ones.  Examples:
  ("\\prime" ?′)
  ("\\prod" ?∏)
  ("\\propto" ?∝)
+ ("\\qdrt" ?∜)
  ("\\qed" ?∎)
  ("\\quad" ? )
  ("\\rangle" ?\⟩) ;; Was ?〉, see bug#12948.
+ ("\\ratio" ?∶)
  ("\\rbrace" ?})
  ("\\rbrack" ?\])
  ("\\rceil" ?⌉)
+ ("\\rddots" ?⋰)
+ ("\\rect" ?▭)
  ("\\rfloor" ?⌋)
  ("\\rightarrow" ?→)
  ("\\rightarrowtail" ?↣)
@@ -565,6 +609,8 @@ system, including many technical ones.  Examples:
  ("\\rightrightarrows" ?⇉)
  ("\\rightthreetimes" ?⋌)
  ("\\risingdotseq" ?≓)
+ ("\\rrect" ?▢)
+ ("\\sdiv" ?⁄)
  ("\\rtimes" ?⋊)
  ("\\sbs" ?﹨)
  ("\\searrow" ?↘)
@@ -577,6 +623,7 @@ system, including many technical ones.  Examples:
  ("\\smallamalg" ?∐)
  ("\\smallsetminus" ?∖)
  ("\\smallsmile" ?⌣)
+ ("\\smash" ?⬍)
  ("\\smile" ?⌣)
  ("\\spadesuit" ?♠)
  ("\\sphericalangle" ?∢)
@@ -627,12 +674,16 @@ system, including many technical ones.  Examples:
  ("\\ulcorner" ?⌜)
  ("\\uparrow" ?↑)
  ("\\updownarrow" ?↕)
+ ("\\underbar" ?▁)
+ ("\\underbrace" ?⏟)
+ ("\\underparen" ?⏝)
  ("\\upleftharpoon" ?↿)
  ("\\uplus" ?⊎)
  ("\\uprightharpoon" ?↾)
  ("\\upuparrows" ?⇈)
  ("\\urcorner" ?⌝)
  ("\\u{i}" ?ĭ)
+ ("\\vbar" ?│)
  ("\\vDash" ?⊨)
 
  ((lambda (name char)
@@ -655,6 +706,7 @@ system, including many technical ones.  Examples:
  ("\\vee" ?∨)
  ("\\veebar" ?⊻)
  ("\\vert" ?|)
+ ("\\vphantom" ?⇳)
  ("\\wedge" ?∧)
  ("\\wp" ?℘)
  ("\\wr" ?≀)
diff --git a/lisp/leim/quail/latin-post.el b/lisp/leim/quail/latin-post.el
index 1040877..8329fff 100644
--- a/lisp/leim/quail/latin-post.el
+++ b/lisp/leim/quail/latin-post.el
@@ -1298,6 +1298,64 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\=`\\=` -> a\\=`
  ("a__" ["a_"])
  )
 
+;; Input modes of various orthographies for the Lakota language.
+;; I'd like to acknowledge the elders and ancestors who fought
+;; to keep the language and culture alive.
+;; Grant Shangreaux <grant@churls.world> 2021-05-23
+
+(quail-define-package
+ "lakota-white-hat-postfix" "Lakota" "Lak " t
+ "Lakota White Hat orthography input method with postfix modifiers.
+The `f' key produces the nasal ŋ while unused letters `r' and `v' add
+the combining dot above and macron diacritics respectively.  This allows
+production of all the consonants:
+
+cv -> c̄    hr -> ḣ    pv -> p̄    tv -> t̄
+cr -> ċ    kv -> k̄    pr -> ṗ    tr -> ṫ
+gr -> ġ    kr -> k̇    sr -> ṡ    zr -> ż
+
+The glottal stop is produced by repeating the ' character.  This orthography
+does not use stress diacritics on vowels. Mit̄ak̄uyep̄i p̄ilamayayap̄ilo."
+nil t nil nil nil nil nil nil nil nil t)
+
+(quail-define-rules
+ ("f" ?ŋ)
+ ("''" ?’)
+ ;; using hex representation as these characters combine with the ? syntax
+ ("r" #x307)                            ; COMBINING DOT ABOVE
+ ("v" #x304))                            ; COMBINING MACRON
+
+
+
+(quail-define-package
+ "lakota-slo-postfix" "Lakota" "SLO " t
+ "Suggested Lakota Orthography input method with postfix modifier.
+To add stress to a vowel, simply type the single quote ' after the vowel.
+The glottal stop is produced by repeating the ' character.  All other
+characters are bound to a single key.  Mitákuyepi philámayayapi ló."
+nil t nil nil nil nil nil nil nil nil t)
+
+(quail-define-rules
+ ;; accented vowels
+ ("a'" ?á) ("A'" ?Á)
+ ("e'" ?é) ("E'" ?É)
+ ("i'" ?í) ("I'" ?Í)
+ ("o'" ?ó) ("O'" ?Ó)
+ ("u'" ?ú) ("U'" ?Ú)
+
+ ;; consonants with caron
+ ("c" ?č) ("C" ?Č)
+ ("j" ?ȟ) ("J" ?Ȟ)
+ ("q" ?ǧ) ("Q" ?Ǧ)
+ ("x" ?ž) ("X" ?Ž)
+ ("r" ?š) ("R" ?Š)
+
+ ;; velar nasal n
+ ("f" ?ŋ)
+
+ ;; glottal stop
+ ("''" ?’))
+
 (quail-define-package
  "norwegian-postfix" "Latin-1" "NO<" t
  "Norwegian (Norsk) input method (rule: AE->Æ   OE->Ø   AA->Å   E\\='->É
diff --git a/lisp/leim/quail/latin-pre.el b/lisp/leim/quail/latin-pre.el
index b8b0fab..3b9c942 100644
--- a/lisp/leim/quail/latin-pre.el
+++ b/lisp/leim/quail/latin-pre.el
@@ -1337,4 +1337,33 @@ Doubling the prefix separates the letter and prefix. --a 
-> -a
  ("``"  ["`"])
  )
 
+(quail-define-package
+ "lakota-slo-prefix" "Lakota" "SLO " t
+ "Suggested Lakota Orthography input method with prefix modifier.
+To add stress to a vowel, simply type the single quote ' before the vowel.
+The glottal stop is produced by repeating the ' character.  All other
+characters are bound to a single key.  Mitákuyepi philámayayapi ló."
+nil t nil nil nil nil nil nil nil nil t)
+
+(quail-define-rules
+ ;; accented vowels
+ ("'a" ?á) ("'A" ?Á)
+ ("'e" ?é) ("'E" ?É)
+ ("'i" ?í) ("'I" ?Í)
+ ("'o" ?ó) ("'O" ?Ó)
+ ("'u" ?ú) ("'U" ?Ú)
+
+ ;; consonants with caron
+ ("c" ?č) ("C" ?Č)
+ ("j" ?ȟ) ("J" ?Ȟ)
+ ("q" ?ǧ) ("Q" ?Ǧ)
+ ("x" ?ž) ("X" ?Ž)
+ ("r" ?š) ("R" ?Š)
+
+ ;; velar nasal n
+ ("f" ?ŋ)
+
+ ;; glottal stop
+ ("''" ?’))
+
 ;;; latin-pre.el ends here
diff --git a/lisp/loadup.el b/lisp/loadup.el
index c82d081..158c02e 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -449,7 +449,7 @@ lost after dumping")))
 ;; At this point, we're ready to resume undo recording for scratch.
 (buffer-enable-undo "*scratch*")
 
-(when (featurep 'nativecomp)
+(when (featurep 'native-compile)
   ;; Fix the compilation unit filename to have it working when
   ;; installed or if the source directory got moved.  This is set to be
   ;; a pair in the form of:
@@ -521,7 +521,7 @@ lost after dumping")))
                         ((equal dump-mode "bootstrap") "emacs")
                         ((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
                         (t (error "unrecognized dump mode %s" dump-mode)))))
-      (when (and (featurep 'nativecomp)
+      (when (and (featurep 'native-compile)
                  (equal dump-mode "pdump"))
         ;; Don't enable this before bootstrap is completed, as the
         ;; compiler infrastructure may not be usable yet.
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 455ae7f..e479a8e 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -3357,6 +3357,11 @@ removing prefixes such as Re:, Fwd: and so on and 
mailing list
 tags such as [tag]."
   (let ((subject (or (rmail-get-header "Subject" msgnum) ""))
        (regexp "\\`[ \t\n]*\\(\\(\\w\\{1,4\\}\u00a0*[::]\\|\\[[^]]+]\\)[ 
\t\n]+\\)*"))
+    ;; Corporate mailing systems sometimes add `[External] :'; if that 
happened,
+    ;; delete everything up thru there.  Empirically, that deletion makes
+    ;; the Subject match the other messages in the thread.
+    (if (string-match "\\[external][ \t\n]*:" subject)
+        (setq subject (substring subject (match-end 0))))
     (setq subject (rfc2047-decode-string subject))
     (setq subject (replace-regexp-in-string regexp "" subject))
     (replace-regexp-in-string "[ \t\n]+" " " subject)))
@@ -3762,32 +3767,61 @@ use \\[mail-yank-original] to yank the original message 
into it."
     (rmail-apply-in-message
      rmail-current-message
      (lambda ()
-       (search-forward "\n\n" nil 'move)
-       (narrow-to-region (point-min) (point))
-       (setq from (mail-fetch-field "from")
-            reply-to (or (mail-fetch-field "mail-reply-to" nil t)
-                         (mail-fetch-field "reply-to" nil t)
-                         from)
-            subject (mail-fetch-field "subject")
-            date (mail-fetch-field "date")
-            message-id (mail-fetch-field "message-id")
-            references (mail-fetch-field "references" nil nil t)
-            ;; Bug#512.  It's inappropriate to reply to these addresses.
-            ;;resent-reply-to (mail-fetch-field "resent-reply-to" nil t)
-            ;;resent-cc (and (not just-sender)
-            ;;             (mail-fetch-field "resent-cc" nil t))
-            ;;resent-to (or (mail-fetch-field "resent-to" nil t) "")
-            ;;resent-subject (mail-fetch-field "resent-subject")
-            ;;resent-date (mail-fetch-field "resent-date")
-            ;;resent-message-id (mail-fetch-field "resent-message-id")
-            )
-       (unless just-sender
-        (if (mail-fetch-field "mail-followup-to" nil t)
-            ;; If this header field is present, use it instead of the
-            ;; To and Cc fields.
-            (setq to (mail-fetch-field "mail-followup-to" nil t))
-          (setq cc (or (mail-fetch-field "cc" nil t) "")
-                to (or (mail-fetch-field "to" nil t) ""))))))
+       (let ((end (point-max))
+             subheader)
+         ;; Find the message's real header.
+         (search-forward "\n\n" nil 'move)
+         (narrow-to-region (point-min) (point))
+
+         (goto-char (point-min))
+
+         ;; If this is an encrypted message, search for other header fields
+         ;; inside the encrypted part, and use them instead of the real header.
+
+         ;; First, find a From: field after a plausible section start.
+         (when (and (search-forward "\nContent-Type: multipart/encrypted;\n" 
nil t)
+                    (save-restriction
+                      (narrow-to-region (point-min) end)
+                      (and (search-forward "\nFrom: " nil t)
+                           (setq subheader (point)))))
+           ;; We found one, so widen up to end of message and go there.
+           (narrow-to-region (point-min) end)
+           (goto-char subheader)
+
+           ;; Find the start of the inner header.
+           (search-backward "\n--")
+           (forward-line 2)
+
+           ;; Find the end of it.
+           (let ((subheader-start (point)))
+             (goto-char subheader)
+             (search-forward "\n\n" nil 'move)
+             (narrow-to-region subheader-start (point))))
+
+         (setq from (mail-fetch-field "from")
+               reply-to (or (mail-fetch-field "mail-reply-to" nil t)
+                            (mail-fetch-field "reply-to" nil t)
+                            from)
+               subject (mail-fetch-field "subject")
+               date (mail-fetch-field "date")
+               message-id (mail-fetch-field "message-id")
+               references (mail-fetch-field "references" nil nil t)
+               ;; Bug#512.  It's inappropriate to reply to these addresses.
+               ;;resent-reply-to (mail-fetch-field "resent-reply-to" nil t)
+               ;;resent-cc (and (not just-sender)
+               ;;          (mail-fetch-field "resent-cc" nil t))
+               ;;resent-to (or (mail-fetch-field "resent-to" nil t) "")
+               ;;resent-subject (mail-fetch-field "resent-subject")
+               ;;resent-date (mail-fetch-field "resent-date")
+               ;;resent-message-id (mail-fetch-field "resent-message-id")
+               )
+         (unless just-sender
+           (if (mail-fetch-field "mail-followup-to" nil t)
+               ;; If this header field is present, use it instead of the
+               ;; To and Cc fields.
+               (setq to (mail-fetch-field "mail-followup-to" nil t))
+             (setq cc (or (mail-fetch-field "cc" nil t) "")
+                   to (or (mail-fetch-field "to" nil t) "")))))))
     ;; Merge the resent-to and resent-cc into the to and cc.
     ;; Bug#512.  It's inappropriate to reply to these addresses.
     ;;(if (and resent-to (not (equal resent-to "")))
@@ -4585,8 +4619,9 @@ Argument MIME is non-nil if this is a mime message."
   ;; change it in one of the calls to `epa-decrypt-region'.
 
   (save-excursion
-    (let (decrypts (mime (rmail-mime-message-p))
-                   mime-disabled)
+    (let (decrypts
+          (mime (and (eq major-mode 'rmail-mode) (rmail-mime-message-p)))
+          mime-disabled)
       (goto-char (point-min))
 
       ;; Turn off mime processing.
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index f53e6e7..44cff21 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -755,7 +755,11 @@ the message being processed."
                                   (forward-char -1)
                                   (skip-chars-backward " \t")
                                   (point))))))
-                   len mch lo)
+                   len mch lo newline)
+               ;; If there are multiple lines in FROM,
+               ;; discard up to the last newline in it.
+               (while (setq newline (string-match "\n" from))
+                 (setq from (substring from (1+ newline))))
               (if (or (null from)
                       (string-match
                        (or rmail-user-mail-address-regexp
diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el
index cd07166..fee11c0 100644
--- a/lisp/mail/sendmail.el
+++ b/lisp/mail/sendmail.el
@@ -30,6 +30,7 @@
 (require 'mail-utils)
 (require 'rfc2047)
 (autoload 'message-make-date "message")
+(autoload 'message-narrow-to-headers "message")
 
 (defgroup sendmail nil
   "Mail sending commands for Emacs."
@@ -725,14 +726,21 @@ Turning on Mail mode runs the normal hooks 
`text-mode-hook' and
   ;; Lines containing just >= 3 dashes, perhaps after whitespace,
   ;; are also sometimes used and should be separators.
   (setq paragraph-separate
-       (concat (regexp-quote mail-header-separator)
+        (if (zerop (length mail-header-separator))
+           (concat
                ;; This is based on adaptive-fill-regexp (presumably
                ;; the idea is to allow navigation etc of cited paragraphs).
-               "$\\|\t*[-–!|#%;>*·•‣⁃◦ ]+$"
+               "\t*[-–!|#%;>*·•‣⁃◦ ]+$"
                "\\|[ \t]*[-[:alnum:]]*>+[ \t]*$\\|[ \t]*$\\|"
                "--\\( \\|-+\\)$\\|"
-               page-delimiter)))
-
+               page-delimiter)
+         (concat (regexp-quote mail-header-separator)
+                  ;; This is based on adaptive-fill-regexp (presumably
+                  ;; the idea is to allow navigation etc of cited paragraphs).
+                  "$\\|\t*[-–!|#%;>*·•‣⁃◦ ]+$"
+                  "\\|[ \t]*[-[:alnum:]]*>+[ \t]*$\\|[ \t]*$\\|"
+                  "--\\( \\|-+\\)$\\|"
+                  page-delimiter))))
 
 (defun mail-header-end ()
   "Return the buffer location of the end of headers, as a number."
@@ -762,10 +770,11 @@ Concretely: replace the first blank line in the header 
with the separator."
   "Remove header separator to put the message in correct form for sendmail.
 Leave point at the start of the delimiter line."
   (goto-char (point-min))
-  (when (re-search-forward
-        (concat "^" (regexp-quote mail-header-separator) "\n")
-        nil t)
-    (replace-match "\n"))
+  (unless (zerop (length mail-header-separator))
+    (when (re-search-forward
+           (concat "^" (regexp-quote mail-header-separator) "\n")
+           nil t)
+      (replace-match "\n")))
   (rfc822-goto-eoh))
 
 (defun mail-mode-auto-fill ()
@@ -887,8 +896,9 @@ the user from the mailer."
                 (concat "\\(?:[[:space:];,]\\|\\`\\)"
                         (regexp-opt mail-mailing-lists t)
                         "\\(?:[[:space:];,]\\|\\'\\)"))))
-        (mail-combine-fields "To")
-        (mail-combine-fields "Cc")
+        (unless noninteractive
+          (mail-combine-fields "To")
+          (mail-combine-fields "Cc"))
        ;; If there are mailing lists defined
        (when ml
          (save-excursion
@@ -930,7 +940,9 @@ the user from the mailer."
                (error "Message contains non-ASCII characters"))))
        ;; Complain about any invalid line.
        (goto-char (point-min))
-       (re-search-forward (regexp-quote mail-header-separator) (point-max) t)
+        ;; Search for mail-header-eeparator as whole line.
+       (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")
+                           (point-max) t)
        (let ((header-end (or (match-beginning 0) (point-max))))
          (goto-char (point-min))
          (while (< (point) header-end)
@@ -961,7 +973,10 @@ the user from the mailer."
 
 (defun mail-envelope-from ()
   "Return the envelope mail address to use when sending mail.
-This function uses `mail-envelope-from'."
+This function uses the `mail-envelope-from' variable.
+
+The buffer should be narrowed to the headers of the mail message
+before this function is called."
   (if (eq mail-envelope-from 'header)
       (nth 1 (mail-extract-address-components
              (mail-fetch-field "From")))
@@ -1177,7 +1192,12 @@ external program defined by `sendmail-program'."
        ;; local binding in the mail buffer will take effect.
        (envelope-from
         (and mail-specify-envelope-from
-             (or (mail-envelope-from) user-mail-address))))
+             (or (save-restriction
+                    ;; Only look at the headers when fetching the
+                    ;; envelope address.
+                    (message-narrow-to-headers)
+                    (mail-envelope-from))
+                  user-mail-address))))
     (unwind-protect
        (with-current-buffer tembuf
          (erase-buffer)
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index ab58aa4..c1e2280 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -207,11 +207,15 @@ for `smtpmail-try-auth-method'.")
         ;; Examine this variable now, so that
        ;; local binding in the mail buffer will take effect.
        (smtpmail-mail-address
-         (or (and mail-specify-envelope-from (mail-envelope-from))
-             (let ((from (mail-fetch-field "from")))
-              (and from
-                   (cadr (mail-extract-address-components from))))
-            (smtpmail-user-mail-address)))
+         (save-restriction
+           ;; Only look at the headers when fetching the
+           ;; envelope address.
+           (message-narrow-to-headers)
+           (or (and mail-specify-envelope-from (mail-envelope-from))
+               (let ((from (mail-fetch-field "from")))
+                (and from
+                     (cadr (mail-extract-address-components from))))
+              (smtpmail-user-mail-address))))
        (smtpmail-code-conv-from
         (if enable-multibyte-characters
             (let ((sendmail-coding-system smtpmail-code-conv-from))
@@ -434,7 +438,12 @@ for `smtpmail-try-auth-method'.")
          (let ((coding-system-for-read 'no-conversion))
            (insert-file-contents file-data))
           (let ((smtpmail-mail-address
-                 (or (and mail-specify-envelope-from (mail-envelope-from))
+                 (or (and mail-specify-envelope-from
+                          (save-restriction
+                            ;; Only look at the headers when fetching the
+                            ;; envelope address.
+                            (message-narrow-to-headers)
+                            (mail-envelope-from)))
                      user-mail-address)))
             (if (not (null smtpmail-recipient-address-list))
                 (when (setq result (smtpmail-via-smtp
@@ -677,13 +686,17 @@ Returns an error if the server cannot be contacted."
         ;; `smtpmail-mail-address' should be set to the appropriate
         ;; buffer-local value by the caller, but in case not:
         (envelope-from
-        (or smtpmail-mail-address
-            (and mail-specify-envelope-from
-                 (mail-envelope-from))
-            (let ((from (mail-fetch-field "from")))
-              (and from
-                   (cadr (mail-extract-address-components from))))
-            (smtpmail-user-mail-address)))
+         (save-restriction
+           ;; Only look at the headers when fetching the
+           ;; envelope address.
+           (message-narrow-to-headers)
+          (or smtpmail-mail-address
+              (and mail-specify-envelope-from
+                   (mail-envelope-from))
+              (let ((from (mail-fetch-field "from")))
+                (and from
+                     (cadr (mail-extract-address-components from))))
+              (smtpmail-user-mail-address))))
        process-buffer
        result
        auth-mechanisms
diff --git a/lisp/mail/supercite.el b/lisp/mail/supercite.el
index dc1c641..d545b0c 100644
--- a/lisp/mail/supercite.el
+++ b/lisp/mail/supercite.el
@@ -1128,6 +1128,8 @@ selection but before querying is performed.  During
 auto-selected citation string and the variable `attribution' is bound
 to the auto-selected attribution string."
   (run-hooks 'sc-attribs-preselect-hook)
+  (with-suppressed-warnings ((lexical citation attribution))
+    (defvar citation) (defvar attribution))
   (let ((query-p sc-confirm-always-p)
        attribution citation
        (attriblist sc-preferred-attribution-list))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index e6cce59..739e751 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -79,9 +79,6 @@
                   :help "Print current buffer with page headings"))
     menu))
 
-;; Only declared obsolete (and only made a proper alias) in 23.3.
-(define-obsolete-variable-alias
-  'menu-bar-files-menu 'menu-bar-file-menu "22.1")
 (defvar menu-bar-file-menu
   (let ((menu (make-sparse-keymap "File")))
 
@@ -459,9 +456,6 @@
 (defvar menu-bar-edit-menu
   (let ((menu (make-sparse-keymap "Edit")))
 
-    (bindings--define-key menu [props]
-      '(menu-item "Text Properties" facemenu-menu))
-
     ;; ns-win.el said: Add spell for platform consistency.
     (if (featurep 'ns)
         (bindings--define-key menu [spell]
@@ -495,7 +489,7 @@
       '(menu-item "Select All" mark-whole-buffer
                   :help "Mark the whole buffer for a subsequent cut/copy"))
     (bindings--define-key menu [clear]
-      '(menu-item "Clear" delete-region
+      '(menu-item "Clear" delete-active-region
                   :enable (and mark-active
                                (not buffer-read-only))
                   :help
@@ -1882,6 +1876,9 @@ they ran"))
     (bindings--define-key menu [describe-function]
       '(menu-item "Describe Function..." describe-function
                   :help "Display documentation of function/command"))
+    (bindings--define-key menu [describe-command]
+      '(menu-item "Describe Command..." describe-command
+                  :help "Display documentation of command"))
     (bindings--define-key menu [shortdoc-display-group]
       '(menu-item "Function Group Overview..." shortdoc-display-group
                   :help "Display a function overview for a specific topic"))
@@ -2244,6 +2241,7 @@ Buffers menu is regenerated."
   "String to display in buffer listings for buffers not visiting a file.")
 
 (defun menu-bar-select-buffer ()
+  (declare (obsolete nil "28.1"))
   (interactive)
   (switch-to-buffer last-command-event))
 
@@ -2291,9 +2289,10 @@ It must accept a buffer as its only required argument.")
       (setq i (1- i))
       (aset buffers-vec i
             (cons (car pair)
-                  `(lambda ()
-                     (interactive)
-                     (funcall menu-bar-select-buffer-function ,(cdr pair))))))
+                  (let ((buf (cdr pair)))
+                    (lambda ()
+                      (interactive)
+                      (funcall menu-bar-select-buffer-function buf))))))
     buffers-vec))
 
 (defun menu-bar-update-buffers (&optional force)
@@ -2348,8 +2347,8 @@ It must accept a buffer as its only required argument.")
                (aset frames-vec i
                      (cons
                       (frame-parameter frame 'name)
-                      `(lambda ()
-                         (interactive) (menu-bar-select-frame ,frame))))
+                      (lambda ()
+                        (interactive) (menu-bar-select-frame frame))))
                (setq i (1+ i)))
             ;; Put it after the normal buffers
             (setq buffers-menu
diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el
index 1aac337..e935cfd 100644
--- a/lisp/mh-e/mh-e.el
+++ b/lisp/mh-e/mh-e.el
@@ -738,8 +738,11 @@ is described by the variable `mh-variants'."
       ;; Make a unique list of directories, keeping the given order.
       ;; We don't want the same MH variant to be listed multiple times.
       (cl-loop for dir in (append mh-path mh-sys-path exec-path) do
-               (setq dir (file-chase-links (directory-file-name dir)))
-               (cl-pushnew dir list-unique :test #'equal))
+               ;; skip relative dirs, typically "."
+               (if (file-name-absolute-p dir)
+                   (progn
+                     (setq dir (file-chase-links (directory-file-name dir)))
+                     (cl-pushnew dir list-unique :test #'equal))))
       (cl-loop for dir in (nreverse list-unique) do
                (when (and dir (file-accessible-directory-p dir))
                  (let ((variant (mh-variant-info dir)))
diff --git a/lisp/mh-e/mh-junk.el b/lisp/mh-e/mh-junk.el
index e50bf8d..95a9bb4 100644
--- a/lisp/mh-e/mh-junk.el
+++ b/lisp/mh-e/mh-junk.el
@@ -175,7 +175,7 @@ classified as spam (see the option `mh-junk-program')."
 
 SpamAssassin is one of the more popular spam filtering programs.
 Get it from your local distribution or from the SpamAssassin web
-site at URL `http://spamassassin.org/'.
+site at URL `https://spamassassin.apache.org/'.
 
 To use SpamAssassin, add the following recipes to
 \".procmailrc\":
@@ -196,7 +196,7 @@ To use SpamAssassin, add the following recipes to
     * ^X-Spam-Status: Yes
     spam/.
 
-If you don't use \"spamc\", use \"spamassassin -P -a\".
+If you don't use \"spamc\", use \"spamassassin\".
 
 Note that one of the recipes above throws away messages with a
 score greater than or equal to 10. Here's how you can determine a
@@ -243,16 +243,7 @@ in the \"blacklist_from\" entries from the last blank line 
in
 information can be used so that you can replace multiple
 \"blacklist_from\" entries with a single wildcard entry such as:
 
-    blacklist_from *@*amazingoffersdirect2u.com
-
-In versions of SpamAssassin (2.50 and on) that support a Bayesian
-classifier, \\[mh-junk-blacklist] uses the program \"sa-learn\"
-to recategorize the message as spam. Neither MH-E, nor
-SpamAssassin, rebuilds the database after adding words, so you
-will need to run \"sa-learn --rebuild\" periodically. This can be
-done by adding the following to your crontab:
-
-    0 * * * *   sa-learn --rebuild > /dev/null 2>&1"
+    blacklist_from *@*amazingoffersdirect2u.com"
   (unless mh-spamassassin-executable
     (error "Unable to find the spamassassin executable"))
   (let ((current-folder mh-current-folder)
@@ -264,13 +255,13 @@ done by adding the following to your crontab:
     ;; (this happens if mh-junk-background is t).
     (with-current-buffer mh-log-buffer
       (call-process mh-spamassassin-executable msg-file mh-junk-background nil
-                    ;;"--report" "--remove-from-whitelist"
-                    "-r" "-R")          ; spamassassin V2.20
+                    ;; -R removes from allow-list
+                    "--report" "-R")
     (when mh-sa-learn-executable
       (message "Recategorizing message %d as spam..." msg)
       (mh-truncate-log-buffer)
       (call-process mh-sa-learn-executable msg-file mh-junk-background nil
-                    "--single" "--spam" "--local" "--no-rebuild")))
+                    "--spam" "--local" "--no-sync")))
     (message "Blacklisting sender of message %d..." msg)
     (with-current-buffer (get-buffer-create mh-temp-buffer)
       (erase-buffer)
@@ -304,8 +295,7 @@ See `mh-spamassassin-blacklist' for more information."
       (erase-buffer)
       (message "Removing spamassassin markup from message %d..." msg)
       (call-process mh-spamassassin-executable msg-file t nil
-                    ;; "--remove-markup"
-                    "-d")               ; spamassassin V2.20
+                    "--remove-markup")
       (if show-buffer
           (kill-buffer show-buffer))
       (write-file msg-file)
@@ -316,7 +306,7 @@ See `mh-spamassassin-blacklist' for more information."
         ;; (this happens if mh-junk-background is t).
         (with-current-buffer mh-log-buffer
           (call-process mh-sa-learn-executable msg-file mh-junk-background nil
-                        "--single" "--ham" "--local" "--no-rebuild")))
+                        "--ham" "--local" "--no-sync")))
       (message "Whitelisting sender of message %d..." msg)
       (setq from
             (car (mh-funcall-if-exists
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 2400624..813ce14 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -126,6 +126,13 @@ This metadata is an alist.  Currently understood keys are:
    three-element lists: completion, its prefix and suffix.  This
    function takes priority over `annotation-function' when both are
    provided, so only this function is used.
+- `group-function': function for grouping the completion candidates.
+   Takes two arguments: a completion candidate (COMPLETION) and a
+   boolean flag (TRANSFORM).  If TRANSFORM is nil, the function
+   returns the group title of the group to which the candidate
+   belongs.  The returned title may be nil.  Otherwise the function
+   returns the transformed candidate.  The transformation can remove a
+   redundant prefix, which is displayed in the group title.
 - `display-sort-function': function to sort entries in *Completions*.
    Takes one argument (COMPLETIONS) and should return a new list
    of completions.  Can operate destructively.
@@ -734,14 +741,16 @@ If ARGS are provided, then pass MESSAGE through 
`format-message'."
                 ;; Don't overwrite the face properties the caller has set
                 (text-properties-at 0 message))
       (setq message (apply #'propertize message 
minibuffer-message-properties)))
-    (let ((ol (make-overlay (point-max) (point-max) nil t t))
-          ;; A quit during sit-for normally only interrupts the sit-for,
-          ;; but since minibuffer-message is used at the end of a command,
-          ;; at a time when the command has virtually finished already, a C-g
-          ;; should really cause an abort-recursive-edit instead (i.e. as if
-          ;; the C-g had been typed at top-level).  Binding inhibit-quit here
-          ;; is an attempt to get that behavior.
-          (inhibit-quit t))
+    ;; Put overlay either on `minibuffer-message' property, or at EOB.
+    (let* ((ovpos (minibuffer--message-overlay-pos))
+           (ol (make-overlay ovpos ovpos nil t t))
+           ;; A quit during sit-for normally only interrupts the sit-for,
+           ;; but since minibuffer-message is used at the end of a command,
+           ;; at a time when the command has virtually finished already, a C-g
+           ;; should really cause an abort-recursive-edit instead (i.e. as if
+           ;; the C-g had been typed at top-level).  Binding inhibit-quit here
+           ;; is an attempt to get that behavior.
+           (inhibit-quit t))
       (unwind-protect
           (progn
             (unless (zerop (length message))
@@ -750,6 +759,12 @@ If ARGS are provided, then pass MESSAGE through 
`format-message'."
               ;; before or after the string, so let's spoon-feed it the pos.
               (put-text-property 0 1 'cursor t message))
             (overlay-put ol 'after-string message)
+            ;; Make sure the overlay with the message is displayed before
+            ;; any other overlays in that position, in case they have
+            ;; resize-mini-windows set to nil and the other overlay strings
+            ;; are too long for the mini-window width.  This makes sure the
+            ;; temporary message will always be visible.
+            (overlay-put ol 'priority 1100)
             (sit-for (or minibuffer-message-timeout 1000000)))
         (delete-overlay ol)))))
 
@@ -771,8 +786,10 @@ and `clear-minibuffer-message' called automatically via
 (defvar minibuffer-message-overlay nil)
 
 (defun minibuffer--message-overlay-pos ()
-  "Return position where `set-minibuffer-message' shall put message overlay."
-  ;; Starting from point, look for non-nil 'minibuffer-message'
+  "Return position where minibuffer message functions shall put message 
overlay.
+The minibuffer message functions include `minibuffer-message' and
+`set-minibuffer-message'."
+  ;; Starting from point, look for non-nil `minibuffer-message'
   ;; property, and return its position.  If none found, return the EOB
   ;; position.
   (let* ((pt (point))
@@ -817,7 +834,7 @@ via `set-message-function'."
           ;; The current C cursor code doesn't know to use the overlay's
           ;; marker's stickiness to figure out whether to place the cursor
           ;; before or after the string, so let's spoon-feed it the pos.
-          (put-text-property 0 1 'cursor 1 message))
+          (put-text-property 0 1 'cursor t message))
         (overlay-put minibuffer-message-overlay 'after-string message)
         ;; Make sure the overlay with the message is displayed before
         ;; any other overlays in that position, in case they have
@@ -865,6 +882,12 @@ If the current buffer is not a minibuffer, erase its 
entire contents."
   ;; is on, the field doesn't cover the entire minibuffer contents.
   (delete-region (minibuffer-prompt-end) (point-max)))
 
+(defun minibuffer--completion-prompt-end ()
+  (let ((end (minibuffer-prompt-end)))
+    (if (< (point) end)
+        (user-error "Can't complete in prompt")
+      end)))
+
 (defvar completion-show-inline-help t
   "If non-nil, print helpful inline messages during completion.")
 
@@ -1138,6 +1161,44 @@ completion candidates than this number."
   :version "24.1"
   :type completion--cycling-threshold-type)
 
+(defcustom completions-group nil
+  "Enable grouping of completion candidates in the *Completions* buffer.
+See also `completions-group-format' and `completions-group-sort'."
+  :type 'boolean
+  :version "28.1")
+
+(defcustom completions-group-sort nil
+  "Sort groups in the *Completions* buffer.
+
+The value can either be nil to disable sorting, `alphabetical' for
+alphabetical sorting or a custom sorting function.  The sorting
+function takes and returns an alist of groups, where each element is a
+pair of a group title string and a list of group candidate strings."
+  :type '(choice (const :tag "No sorting" nil)
+                 (const :tag "Alphabetical sorting" alphabetical)
+                 function)
+  :version "28.1")
+
+(defcustom completions-group-format
+  (concat
+   (propertize "    " 'face 'completions-group-separator)
+   (propertize " %s " 'face 'completions-group-title)
+   (propertize " " 'face 'completions-group-separator
+               'display '(space :align-to right)))
+  "Format string used for the group title."
+  :type 'string
+  :version "28.1")
+
+(defface completions-group-title
+  '((t :inherit shadow :slant italic))
+  "Face used for the title text of the candidate group headlines."
+  :version "28.1")
+
+(defface completions-group-separator
+  '((t :inherit shadow :strike-through t))
+  "Face used for the separator lines between the candidate groups."
+  :version "28.1")
+
 (defun completion--cycle-threshold (metadata)
   (let* ((cat (completion-metadata-get metadata 'category))
          (over (completion--category-override cat 'cycle)))
@@ -1294,10 +1355,9 @@ If no characters can be completed, display a list of 
possible completions.
 If you repeat this command after it displayed such a list,
 scroll the window of possible completions."
   (interactive)
-  (when (<= (minibuffer-prompt-end) (point))
-    (completion-in-region (minibuffer-prompt-end) (point-max)
-                          minibuffer-completion-table
-                          minibuffer-completion-predicate)))
+  (completion-in-region (minibuffer--completion-prompt-end) (point-max)
+                        minibuffer-completion-table
+                        minibuffer-completion-predicate))
 
 (defun completion--in-region-1 (beg end)
   ;; If the previous command was not this,
@@ -1401,6 +1461,22 @@ Remove completion BASE prefix string from history 
elements."
                      (substring c base-size)))
                  hist)))))
 
+(defun minibuffer--group-by (group-fun sort-fun elems)
+  "Group ELEMS by GROUP-FUN and sort groups by SORT-FUN."
+  (let ((groups))
+    (dolist (cand elems)
+      (let* ((key (funcall group-fun cand nil))
+             (group (assoc key groups)))
+        (if group
+            (setcdr group (cons cand (cdr group)))
+          (push (list key cand) groups))))
+    (setq groups (nreverse groups)
+          groups (mapc (lambda (x)
+                         (setcdr x (nreverse (cdr x))))
+                       groups)
+          groups (funcall sort-fun groups))
+    (mapcan #'cdr groups)))
+
 (defun completion-all-sorted-completions (&optional start end)
   (or completion-all-sorted-completions
       (let* ((start (or start (minibuffer-prompt-end)))
@@ -1459,7 +1535,7 @@ Remove completion BASE prefix string from history 
elements."
   (unless completion-cycling
     (minibuffer-force-complete nil nil 'dont-cycle))
   (completion--complete-and-exit
-   (minibuffer-prompt-end) (point-max) #'exit-minibuffer
+   (minibuffer--completion-prompt-end) (point-max) #'exit-minibuffer
    ;; If the previous completion completed to an element which fails
    ;; test-completion, then we shouldn't exit, but that should be rare.
    (lambda ()
@@ -1477,7 +1553,7 @@ DONT-CYCLE tells the function not to setup cycling."
   ;; FIXME: Need to deal with the extra-size issue here as well.
   ;; FIXME: ~/src/emacs/t<M-TAB>/lisp/minibuffer.el completes to
   ;; ~/src/emacs/trunk/ and throws away lisp/minibuffer.el.
-  (let* ((start (copy-marker (or start (minibuffer-prompt-end))))
+  (let* ((start (copy-marker (or start (minibuffer--completion-prompt-end))))
          (end (or end (point-max)))
          ;; (md (completion--field-metadata start))
          (all (completion-all-sorted-completions start end))
@@ -1548,7 +1624,7 @@ If `minibuffer-completion-confirm' is 
`confirm-after-completion',
  `minibuffer-confirm-exit-commands', and accept the input
  otherwise."
   (interactive)
-  (completion-complete-and-exit (minibuffer-prompt-end) (point-max)
+  (completion-complete-and-exit (minibuffer--completion-prompt-end) (point-max)
                                 #'exit-minibuffer))
 
 (defun completion-complete-and-exit (beg end exit-function)
@@ -1714,17 +1790,12 @@ is added, provided that matches some possible 
completion.
 Return nil if there is no valid completion, else t."
   (interactive)
   (completion-in-region--single-word
-   (minibuffer-prompt-end) (point-max)
-   minibuffer-completion-table minibuffer-completion-predicate))
-
-(defun completion-in-region--single-word (beg end collection
-                                              &optional predicate)
-  (let ((minibuffer-completion-table collection)
-        (minibuffer-completion-predicate predicate))
-    (pcase (completion--do-completion beg end
-                                      #'completion--try-word-completion)
+   (minibuffer--completion-prompt-end) (point-max)))
+
+(defun completion-in-region--single-word (beg end)
+  (pcase (completion--do-completion beg end #'completion--try-word-completion)
     (#b000 nil)
-      (_     t))))
+    (_     t)))
 
 (defface completions-annotations '((t :inherit (italic shadow)))
   "Face to use for annotations in the *Completions* buffer.")
@@ -1747,15 +1818,17 @@ or appended to completions."
   :type 'boolean
   :version "28.1")
 
-(defun completion--insert-strings (strings)
+(defun completion--insert-strings (strings &optional group-fun)
   "Insert a list of STRINGS into the current buffer.
-Uses columns to keep the listing readable but compact.
-It also eliminates runs of equal strings."
+The candidate strings are inserted into the buffer depending on the
+completions format as specified by the variable `completions-format'.
+Runs of equal candidate strings are eliminated.  GROUP-FUN is a
+`group-function' used for grouping the completion candidates."
   (when (consp strings)
     (let* ((length (apply #'max
                          (mapcar (lambda (s)
                                    (if (consp s)
-                                       (apply #'+ (mapcar #'string-width s))
+                                       (apply #'+ (mapcar #'string-width s))
                                      (string-width s)))
                                  strings)))
           (window (get-buffer-window (current-buffer) 0))
@@ -1766,104 +1839,158 @@ It also eliminates runs of equal strings."
                     ;; Don't allocate more columns than we can fill.
                     ;; Windows can't show less than 3 lines anyway.
                     (max 1 (/ (length strings) 2))))
-          (colwidth (/ wwidth columns))
-           (column 0)
-          (rows (/ (length strings) columns))
-          (row 0)
-           (first t)
-          (laststring nil))
+          (colwidth (/ wwidth columns)))
       (unless (or tab-stop-list (null completion-tab-width)
                   (zerop (mod colwidth completion-tab-width)))
         ;; Align to tab positions for the case
         ;; when the caller uses tabs inside prefix.
         (setq colwidth (- colwidth (mod colwidth completion-tab-width))))
-      ;; The insertion should be "sensible" no matter what choices were made
-      ;; for the parameters above.
-      (dolist (str strings)
-       (unless (equal laststring str) ; Remove (consecutive) duplicates.
-         (setq laststring str)
+      (funcall (intern (format "completion--insert-%s" completions-format))
+               strings group-fun length wwidth colwidth columns))))
+
+(defun completion--insert-horizontal (strings group-fun
+                                              length wwidth
+                                              colwidth _columns)
+  (let ((column 0)
+        (first t)
+       (last-title nil)
+        (last-string nil))
+    (dolist (str strings)
+      (unless (equal last-string str) ; Remove (consecutive) duplicates.
+       (setq last-string str)
+        (when group-fun
+          (let ((title (funcall group-fun (if (consp str) (car str) str) nil)))
+            (unless (equal title last-title)
+              (setq last-title title)
+              (when title
+                (insert (if first "" "\n") (format completions-group-format 
title) "\n")
+                (setq column 0
+                      first t)))))
+       (unless first
           ;; FIXME: `string-width' doesn't pay attention to
           ;; `display' properties.
-          (let ((length (if (consp str)
-                            (apply #'+ (mapcar #'string-width str))
-                          (string-width str))))
-            (cond
-             ((eq completions-format 'one-column)
-              ;; Nothing special
-              )
-            ((eq completions-format 'vertical)
-             ;; Vertical format
-             (when (> row rows)
-               (forward-line (- -1 rows))
-               (setq row 0 column (+ column colwidth)))
-             (when (> column 0)
-               (end-of-line)
-               (while (> (current-column) column)
-                 (if (eobp)
-                     (insert "\n")
-                   (forward-line 1)
-                   (end-of-line)))
-               (insert " \t")
-               (set-text-properties (1- (point)) (point)
-                                    `(display (space :align-to ,column)))))
-            (t
-             ;; Horizontal format
-             (unless first
-               (if (< wwidth (+ (max colwidth length) column))
-                   ;; No space for `str' at point, move to next line.
-                   (progn (insert "\n") (setq column 0))
-                 (insert " \t")
-                 ;; Leave the space unpropertized so that in the case we're
-                 ;; already past the goal column, there is still
-                 ;; a space displayed.
-                 (set-text-properties (1- (point)) (point)
-                                      ;; We can set tab-width using
-                                      ;; completion-tab-width, but
-                                      ;; the caller can prefer using
-                                      ;; \t to align prefixes.
-                                      `(display (space :align-to ,column)))
-                 nil))))
-            (setq first nil)
-            (if (not (consp str))
-                (put-text-property (point) (progn (insert str) (point))
-                                   'mouse-face 'highlight)
-              ;; If `str' is a list that has 2 elements,
-              ;; then the second element is a suffix annotation.
-              ;; If `str' has 3 elements, then the second element
-              ;; is a prefix, and the third element is a suffix.
-              (let* ((prefix (when (nth 2 str) (nth 1 str)))
-                     (suffix (or (nth 2 str) (nth 1 str))))
-                (when prefix
-                  (let ((beg (point))
-                        (end (progn (insert prefix) (point))))
-                    (put-text-property beg end 'mouse-face nil)))
-                (put-text-property (point) (progn (insert (car str)) (point))
-                                   'mouse-face 'highlight)
-                (let ((beg (point))
-                      (end (progn (insert suffix) (point))))
-                  (put-text-property beg end 'mouse-face nil)
-                  ;; Put the predefined face only when suffix
-                  ;; is added via annotation-function without prefix,
-                  ;; and when the caller doesn't use own face.
-                  (unless (or prefix (text-property-not-all
-                                      0 (length suffix) 'face nil suffix))
-                    (font-lock-prepend-text-property
-                     beg end 'face 'completions-annotations)))))
-           (cond
-             ((eq completions-format 'one-column)
-              (insert "\n"))
-            ((eq completions-format 'vertical)
-             ;; Vertical format
-             (if (> column 0)
-                 (forward-line)
-               (insert "\n"))
-             (setq row (1+ row)))
-            (t
-             ;; Horizontal format
-             ;; Next column to align to.
-             (setq column (+ column
-                             ;; Round up to a whole number of columns.
-                             (* colwidth (ceiling length colwidth))))))))))))
+         (if (< wwidth (+ column (max colwidth
+                                       (if (consp str)
+                                           (apply #'+ (mapcar #'string-width 
str))
+                                         (string-width str)))))
+             ;; No space for `str' at point, move to next line.
+             (progn (insert "\n") (setq column 0))
+           (insert " \t")
+           ;; Leave the space unpropertized so that in the case we're
+           ;; already past the goal column, there is still
+           ;; a space displayed.
+           (set-text-properties (1- (point)) (point)
+                                ;; We can set tab-width using
+                                ;; completion-tab-width, but
+                                ;; the caller can prefer using
+                                ;; \t to align prefixes.
+                                `(display (space :align-to ,column)))
+           nil))
+        (setq first nil)
+        (completion--insert str group-fun)
+       ;; Next column to align to.
+       (setq column (+ column
+                       ;; Round up to a whole number of columns.
+                       (* colwidth (ceiling length colwidth))))))))
+
+(defun completion--insert-vertical (strings group-fun
+                                            _length _wwidth
+                                            colwidth columns)
+  (while strings
+    (let ((group nil)
+          (column 0)
+         (row 0)
+          (rows)
+          (last-string nil))
+      (if group-fun
+          (let* ((str (car strings))
+                 (title (funcall group-fun (if (consp str) (car str) str) 
nil)))
+            (while (and strings
+                        (equal title (funcall group-fun
+                                              (if (consp (car strings))
+                                                  (car (car strings))
+                                                (car strings))
+                                              nil)))
+              (push (car strings) group)
+              (pop strings))
+            (setq group (nreverse group)))
+        (setq group strings
+              strings nil))
+      (setq rows (/ (length group) columns))
+      (when group-fun
+        (let* ((str (car group))
+               (title (funcall group-fun (if (consp str) (car str) str) nil)))
+          (when title
+            (goto-char (point-max))
+            (insert (format completions-group-format title) "\n"))))
+      (dolist (str group)
+        (unless (equal last-string str) ; Remove (consecutive) duplicates.
+         (setq last-string str)
+         (when (> row rows)
+            (forward-line (- -1 rows))
+           (setq row 0 column (+ column colwidth)))
+         (when (> column 0)
+           (end-of-line)
+           (while (> (current-column) column)
+             (if (eobp)
+                 (insert "\n")
+               (forward-line 1)
+               (end-of-line)))
+           (insert " \t")
+           (set-text-properties (1- (point)) (point)
+                                `(display (space :align-to ,column))))
+          (completion--insert str group-fun)
+         (if (> column 0)
+             (forward-line)
+           (insert "\n"))
+         (setq row (1+ row)))))))
+
+(defun completion--insert-one-column (strings group-fun &rest _)
+  (let ((last-title nil) (last-string nil))
+    (dolist (str strings)
+      (unless (equal last-string str) ; Remove (consecutive) duplicates.
+       (setq last-string str)
+        (when group-fun
+          (let ((title (funcall group-fun (if (consp str) (car str) str) nil)))
+            (unless (equal title last-title)
+              (setq last-title title)
+              (when title
+                (insert (format completions-group-format title) "\n")))))
+        (completion--insert str group-fun)
+        (insert "\n")))))
+
+(defun completion--insert (str group-fun)
+  (if (not (consp str))
+      (add-text-properties
+       (point)
+       (progn
+         (insert
+          (if group-fun
+              (funcall group-fun str 'transform)
+            str))
+         (point))
+       `(mouse-face highlight completion--string ,str))
+    ;; If `str' is a list that has 2 elements,
+    ;; then the second element is a suffix annotation.
+    ;; If `str' has 3 elements, then the second element
+    ;; is a prefix, and the third element is a suffix.
+    (let* ((prefix (when (nth 2 str) (nth 1 str)))
+           (suffix (or (nth 2 str) (nth 1 str))))
+      (when prefix
+        (let ((beg (point))
+              (end (progn (insert prefix) (point))))
+          (put-text-property beg end 'mouse-face nil)))
+      (completion--insert (car str) group-fun)
+      (let ((beg (point))
+            (end (progn (insert suffix) (point))))
+        (put-text-property beg end 'mouse-face nil)
+        ;; Put the predefined face only when suffix
+        ;; is added via annotation-function without prefix,
+        ;; and when the caller doesn't use own face.
+        (unless (or prefix (text-property-not-all
+                            0 (length suffix) 'face nil suffix))
+          (font-lock-prepend-text-property
+           beg end 'face 'completions-annotations))))))
 
 (defvar completion-setup-hook nil
   "Normal hook run at the end of setting up a completion list buffer.
@@ -1923,7 +2050,7 @@ and with BASE-SIZE appended as the last element."
         completions)
        base-size))))
 
-(defun display-completion-list (completions &optional common-substring)
+(defun display-completion-list (completions &optional common-substring 
group-fun)
   "Display the list of completions, COMPLETIONS, using `standard-output'.
 Each element may be just a symbol or string
 or may be a list of two strings to be printed as if concatenated.
@@ -1933,7 +2060,9 @@ alternative, the second serves as annotation.
 The actual completion alternatives, as inserted, are given `mouse-face'
 properties of `highlight'.
 At the end, this runs the normal hook `completion-setup-hook'.
-It can find the completion buffer in `standard-output'."
+It can find the completion buffer in `standard-output'.
+GROUP-FUN is a `group-function' used for grouping the completion
+candidates."
   (declare (advertised-calling-convention (completions) "24.4"))
   (if common-substring
       (setq completions (completion-hilit-commonality
@@ -1946,7 +2075,7 @@ It can find the completion buffer in `standard-output'."
        (let ((standard-output (current-buffer))
              (completion-setup-hook nil))
           (with-suppressed-warnings ((callargs display-completion-list))
-           (display-completion-list completions common-substring)))
+           (display-completion-list completions common-substring group-fun)))
        (princ (buffer-string)))
 
     (with-current-buffer standard-output
@@ -1954,7 +2083,7 @@ It can find the completion buffer in `standard-output'."
       (if (null completions)
           (insert "There are no possible completions of what you have typed.")
         (insert "Possible completions are:\n")
-        (completion--insert-strings completions))))
+        (completion--insert-strings completions group-fun))))
 
   (run-hooks 'completion-setup-hook)
   nil)
@@ -2030,7 +2159,7 @@ variables.")
   "Display a list of possible completions of the current minibuffer contents."
   (interactive)
   (message "Making completion list...")
-  (let* ((start (or start (minibuffer-prompt-end)))
+  (let* ((start (or start (minibuffer--completion-prompt-end)))
          (end (or end (point-max)))
          (string (buffer-substring start end))
          (md (completion--field-metadata start))
@@ -2067,6 +2196,8 @@ variables.")
              (aff-fun (or (completion-metadata-get all-md 'affixation-function)
                           (plist-get completion-extra-properties
                                      :affixation-function)))
+             (sort-fun (completion-metadata-get all-md 'display-sort-function))
+             (group-fun (completion-metadata-get all-md 'group-function))
              (mainbuf (current-buffer))
              ;; If the *Completions* buffer is shown in a new
              ;; window, mark it as softly-dedicated, so bury-buffer in
@@ -2098,15 +2229,32 @@ variables.")
                       ;; Remove the base-size tail because `sort' requires a 
properly
                       ;; nil-terminated list.
                       (when last (setcdr last nil))
-                      (setq completions
-                            ;; FIXME: This function is for the output of 
all-completions,
-                            ;; not completion-all-completions.  Often it's the 
same, but
-                            ;; not always.
-                            (let ((sort-fun (completion-metadata-get
-                                             all-md 'display-sort-function)))
-                              (if sort-fun
-                                  (funcall sort-fun completions)
-                                (sort completions 'string-lessp))))
+
+                      ;; Sort first using the `display-sort-function'.
+                      ;; FIXME: This function is for the output of
+                      ;; all-completions, not
+                      ;; completion-all-completions.  Often it's the
+                      ;; same, but not always.
+                      (setq completions (if sort-fun
+                                            (funcall sort-fun completions)
+                                          (sort completions 'string-lessp)))
+
+                      ;; After sorting, group the candidates using the
+                      ;; `group-function'.
+                      (when group-fun
+                        (setq completions
+                              (minibuffer--group-by
+                               group-fun
+                               (pcase completions-group-sort
+                                 ('nil #'identity)
+                                 ('alphabetical
+                                  (lambda (groups)
+                                    (sort groups
+                                          (lambda (x y)
+                                            (string< (car x) (car y))))))
+                                 (_ completions-group-sort))
+                               completions)))
+
                       (cond
                        (aff-fun
                         (setq completions
@@ -2152,7 +2300,7 @@ variables.")
                                                      (if (eq (car bounds) 
(length result))
                                                          'exact 
'finished)))))))
 
-                      (display-completion-list completions)))))
+                      (display-completion-list completions nil group-fun)))))
           nil)))
     nil))
 
@@ -2449,8 +2597,10 @@ The completion method is determined by 
`completion-at-point-functions'."
   (define-key map "\C-g" 'abort-minibuffers)
   (define-key map "\M-<" 'minibuffer-beginning-of-buffer)
 
-  (define-key map "\r" 'exit-minibuffer)
-  (define-key map "\n" 'exit-minibuffer))
+  ;; Put RET last so that it is shown in doc strings in preference to
+  ;; C-j, when using the \\[exit-minibuffer] notation.
+  (define-key map "\n" 'exit-minibuffer)
+  (define-key map "\r" 'exit-minibuffer))
 
 (defvar minibuffer-local-completion-map
   (let ((map (make-sparse-keymap)))
@@ -2463,6 +2613,7 @@ The completion method is determined by 
`completion-at-point-functions'."
     (define-key map "?" 'minibuffer-completion-help)
     (define-key map [prior] 'switch-to-completions)
     (define-key map "\M-v"  'switch-to-completions)
+    (define-key map "\M-g\M-c"  'switch-to-completions)
     map)
   "Local keymap for minibuffer input with completion.")
 
@@ -3010,6 +3161,7 @@ See `read-file-name' for the meaning of the arguments."
         (unless val (error "No file name specified"))
 
         (if (and default-filename
+                (not (file-remote-p dir))
                  (string-equal val (if (consp insdef) (car insdef) insdef)))
             (setq val default-filename))
         (setq val (substitute-in-file-name val))
@@ -3343,7 +3495,8 @@ between 0 and 1, and with faces `completions-common-part',
   (when completions
     (let* ((re (completion-pcm--pattern->regex pattern 'group))
            (point-idx (completion-pcm--pattern-point-idx pattern))
-           (case-fold-search completion-ignore-case))
+           (case-fold-search completion-ignore-case)
+           last-md)
       (mapcar
        (lambda (str)
         ;; Don't modify the string itself.
@@ -3352,7 +3505,7 @@ between 0 and 1, and with faces `completions-common-part',
            (error "Internal error: %s does not match %s" re str))
          (let* ((pos (if point-idx (match-beginning point-idx) (match-end 0)))
                 (match-end (match-end 0))
-                (md (cddr (match-data)))
+                (md (cddr (setq last-md (match-data t last-md))))
                 (from 0)
                 (end (length str))
                 ;; To understand how this works, consider these simple
@@ -3900,13 +4053,7 @@ See `completing-read' for the meaning of the arguments."
                 ;; `read-from-minibuffer' uses 1-based index.
                 (1+ (cdr initial-input)))))
 
-  (let* ((minibuffer-completion-table collection)
-         (minibuffer-completion-predicate predicate)
-         ;; FIXME: Remove/rename this var, see the next one.
-         (minibuffer-completion-confirm (unless (eq require-match t)
-                                          require-match))
-         (minibuffer--require-match require-match)
-         (base-keymap (if require-match
+  (let* ((base-keymap (if require-match
                          minibuffer-local-must-match-map
                         minibuffer-local-completion-map))
          (keymap (if (memq minibuffer-completing-file-name '(nil lambda))
@@ -3919,8 +4066,17 @@ See `completing-read' for the meaning of the arguments."
                     ;; in minibuffer-local-filename-completion-map can
                     ;; override bindings in base-keymap.
                     base-keymap)))
-         (result (read-from-minibuffer prompt initial-input keymap
-                                       nil hist def inherit-input-method)))
+         (result
+          (minibuffer-with-setup-hook
+              (lambda ()
+                (setq-local minibuffer-completion-table collection)
+                (setq-local minibuffer-completion-predicate predicate)
+                ;; FIXME: Remove/rename this var, see the next one.
+                (setq-local minibuffer-completion-confirm
+                            (unless (eq require-match t) require-match))
+                (setq-local minibuffer--require-match require-match))
+            (read-from-minibuffer prompt initial-input keymap
+                                  nil hist def inherit-input-method))))
     (when (and (equal result "") def)
       (setq result (if (consp def) (car def) def)))
     result))
diff --git a/lisp/misearch.el b/lisp/misearch.el
index 335efb9..7f3e981 100644
--- a/lisp/misearch.el
+++ b/lisp/misearch.el
@@ -190,10 +190,10 @@ the initial buffer."
   (if (or (null multi-isearch-pause)
          (and multi-isearch-pause multi-isearch-current-buffer))
       (progn
-       (switch-to-buffer
-        (setq multi-isearch-current-buffer
-              (funcall multi-isearch-next-buffer-current-function
-                       (current-buffer) t)))
+       (setq multi-isearch-current-buffer
+             (funcall multi-isearch-next-buffer-current-function
+                      (current-buffer) t))
+       (multi-isearch-switch-buffer)
        (goto-char (if isearch-forward (point-min) (point-max))))
     (setq multi-isearch-current-buffer (current-buffer))
     (setq isearch-wrapped nil)))
@@ -202,14 +202,25 @@ the initial buffer."
   "Save a function restoring the state of multiple buffers search.
 Save the current buffer to the additional state parameter in the
 search status stack."
-  `(lambda (cmd)
-     (multi-isearch-pop-state cmd ,(current-buffer))))
+  (let ((buf (current-buffer)))
+    (lambda (cmd)
+      (multi-isearch-pop-state cmd buf))))
 
 (defun multi-isearch-pop-state (_cmd buffer)
   "Restore the multiple buffers search state in BUFFER.
 Switch to the buffer restored from the search status stack."
-  (unless (equal buffer (current-buffer))
-    (switch-to-buffer (setq multi-isearch-current-buffer buffer))))
+  (unless (eq buffer (current-buffer))
+    (setq multi-isearch-current-buffer buffer)
+    (multi-isearch-switch-buffer)))
+
+;;;###autoload
+(defun multi-isearch-switch-buffer ()
+  "Switch to the next buffer in multi-buffer search."
+  (when (and (buffer-live-p multi-isearch-current-buffer)
+             (not (eq multi-isearch-current-buffer (current-buffer))))
+    (setq isearch-mode nil)
+    (switch-to-buffer multi-isearch-current-buffer)
+    (setq isearch-mode " M-Isearch")))
 
 
 ;;; Global multi-buffer search invocations
diff --git a/lisp/mouse.el b/lisp/mouse.el
index f4979e3..ab260d4 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -415,7 +415,7 @@ must be one of the symbols `header', `mode', or `vertical'."
                (when (window-live-p (setq posn-window (posn-window start)))
                  ;; Add left edge of `posn-window' to `position'.
                  (setq position (+ (window-pixel-left posn-window) position))
-                 (unless (nth 1 start)
+                 (unless (posn-area start)
                    ;; Add width of objects on the left of the text area to
                    ;; `position'.
                    (when (eq (window-current-scroll-bars posn-window) 'left)
@@ -494,9 +494,11 @@ must be one of the symbols `header', `mode', or 
`vertical'."
               (define-key map [header-line] map)
               (define-key map [vertical-line] map)
               ;; ... and some maybe even with a right- or bottom-divider
-              ;; prefix.
+              ;; or left- or right-margin prefix ...
               (define-key map [right-divider] map)
               (define-key map [bottom-divider] map)
+              (define-key map [left-margin] map)
+              (define-key map [right-margin] map)
               map)
             t (lambda () (setq track-mouse old-track-mouse)))))))
 
@@ -548,6 +550,18 @@ the frame instead."
         (when (frame-parameter frame 'drag-with-header-line)
           (mouse-drag-frame-move start-event))))))
 
+(defun mouse-drag-tab-line (start-event)
+  "Drag frame with tab line in its topmost window.
+START-EVENT is the starting mouse event of the drag action."
+  (interactive "e")
+  (let* ((start (event-start start-event))
+        (window (posn-window start)))
+    (when (and (window-live-p window)
+               (window-at-side-p window 'top))
+      (let ((frame (window-frame window)))
+        (when (frame-parameter frame 'drag-with-tab-line)
+          (mouse-drag-frame-move start-event))))))
+
 (defun mouse-drag-vertical-line (start-event)
   "Change the width of a window by dragging on a vertical line.
 START-EVENT is the starting mouse event of the drag action."
@@ -676,6 +690,7 @@ frame with the mouse."
              ;; with a mode-line, header-line or vertical-line prefix ...
              (define-key map [mode-line] map)
              (define-key map [header-line] map)
+             (define-key map [tab-line] map)
              (define-key map [vertical-line] map)
              ;; ... and some maybe even with a right- or bottom-divider
              ;; prefix.
@@ -902,6 +917,7 @@ frame with the mouse."
              ;; with a mode-line, header-line or vertical-line prefix ...
              (define-key map [mode-line] map)
              (define-key map [header-line] map)
+             (define-key map [tab-line] map)
              (define-key map [vertical-line] map)
              ;; ... and some maybe even with a right- or bottom-divider
              ;; prefix.
@@ -2906,6 +2922,7 @@ is copied instead of being cut."
 ;; versions.
 (global-set-key [header-line down-mouse-1] 'mouse-drag-header-line)
 (global-set-key [header-line mouse-1] 'mouse-select-window)
+(global-set-key [tab-line down-mouse-1] 'mouse-drag-tab-line)
 (global-set-key [tab-line mouse-1] 'mouse-select-window)
 ;; (global-set-key [mode-line drag-mouse-1] 'mouse-select-window)
 (global-set-key [mode-line down-mouse-1] 'mouse-drag-mode-line)
diff --git a/lisp/mpc.el b/lisp/mpc.el
index f730275..ab572aa 100644
--- a/lisp/mpc.el
+++ b/lisp/mpc.el
@@ -125,14 +125,13 @@
           (unless (member elem seen) (push elem res)))))
     (nreverse res)))
 
-(defun mpc-intersection (l1 l2 &optional selectfun)
+(defun mpc-intersection (l1 l2 selectfun)
   "Return L1 after removing all elements not found in L2.
-If SELECTFUN is non-nil, elements aren't compared directly, but instead
+Elements aren't compared directly, but instead
 they are passed through SELECTFUN before comparison."
-  (when selectfun
-    (setq l1 (mapcar selectfun l1))
-    (setq l2 (mapcar selectfun l2)))
-  (seq-intersection l1 l2))
+  (seq-intersection l1 l2 (lambda (x y)
+                            (equal (funcall selectfun x)
+                                   (funcall selectfun y)))))
 
 (defun mpc-event-set-point (event)
   (condition-case nil (posn-set-point (event-end event))
@@ -1027,10 +1026,14 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                      (let ((dir (file-name-directory (cdr (assq 'file info)))))
                        ;; (debug)
                        (setq pred
-                             (lambda (info)
-                               (and (funcall pred info)
-                                    (equal dir (file-name-directory
-                                                (cdr (assq 'file info)))))))
+                             ;; We want the closure to capture the current
+                             ;; value of `pred' and not a reference to the
+                             ;; variable itself.
+                             (let ((oldpred pred))
+                               (lambda (info)
+                                 (and (funcall oldpred info)
+                                      (equal dir (file-name-directory
+                                                  (cdr (assq 'file info))))))))
                        (if-let* ((covers '(".folder.png" "cover.jpg" 
"folder.jpg"))
                                  (cover (cl-loop for file in (directory-files 
(mpc-file-local-copy dir))
                                                  if (member (downcase file) 
covers)
@@ -1057,9 +1060,13 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                          (when (and (null val) (eq tag 'Title))
                            (setq val (cdr (assq 'file info))))
                          (setq pred
-                               (lambda (info)
-                                 (and (funcall pred info)
-                                      (equal val (cdr (assq ',tag info))))))
+                               ;; We want the closure to capture the current
+                               ;; value of `pred' and not a reference to the
+                               ;; variable itself.
+                               (let ((oldpred pred))
+                                 (lambda (info)
+                                   (and (funcall oldpred info)
+                                        (equal val (cdr (assq tag info)))))))
                          (cond
                           ((not (and (eq tag 'Date) (stringp val))) val)
                           ;; For "date", only keep the year!
diff --git a/lisp/msb.el b/lisp/msb.el
index 1064f94..1f05e9d 100644
--- a/lisp/msb.el
+++ b/lisp/msb.el
@@ -1052,9 +1052,12 @@ variable `msb-menu-cond'."
       (msb--split-menus-2 list 0 nil)
     list))
 
+(defun msb--select-buffer ()
+  (interactive)
+  (switch-to-buffer last-command-event))
+
 (defun msb--make-keymap-menu (raw-menu)
-  (let ((end 'menu-bar-select-buffer)
-       (mcount 0))
+  (let ((mcount 0))
     (mapcar
      (lambda (sub-menu)
        (cond
@@ -1063,7 +1066,7 @@ variable `msb-menu-cond'."
        (t
         (let ((buffers (mapcar (lambda (item)
                                  (cons (buffer-name (cdr item))
-                                       (cons (car item) end)))
+                                       (cons (car item) 'msb--select-buffer)))
                                (cdr sub-menu))))
           (nconc (list (cl-incf mcount) (car sub-menu)
                        'keymap (car sub-menu))
diff --git a/lisp/mwheel.el b/lisp/mwheel.el
index 048f50c..b31805a 100644
--- a/lisp/mwheel.el
+++ b/lisp/mwheel.el
@@ -131,7 +131,10 @@ scrolling."
   :version "28.1")
 
 (defcustom mouse-wheel-progressive-speed t
-  "If non-nil, the faster the user moves the wheel, the faster the scrolling.
+  "If nil, scrolling speed is proportional to the wheel speed.
+If non-nil, moving the wheel faster will make scrolling
+progressively faster.
+
 Note that this has no effect when `mouse-wheel-scroll-amount' specifies
 a \"near full screen\" scroll or when the mouse wheel sends key instead
 of button events."
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 04ea809..3f3a3df 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -949,7 +949,11 @@ Some AT&T folks claim to use something called `pftp' here."
   :type 'string)
 
 (defcustom ange-ftp-ftp-program-args '("-i" "-n" "-g" "-v")
-  "A list of arguments passed to the FTP program when started."
+  ;; Clients that use the BSD editline instead of the GNU readline
+  ;; library may need to disable command line editing. (Bug#48494)
+  "A list of arguments passed to the FTP program when started.
+Some FTP clients may also require the \"-e\" argument, which disables
+command line editing."
   :group 'ange-ftp
   :type '(repeat string))
 
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index 1c98335..6d64100 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -47,6 +47,7 @@
 ;; browse-url-xdg-open                freedesktop.org xdg-open
 ;; browse-url-kde                     KDE konqueror (kfm)
 ;; browse-url-elinks                  Elinks      Don't know (tried with 
0.12.GIT)
+;; eww-browse-url                     Emacs Web Wowser
 
 ;; Browsers can cache Web pages so it may be necessary to tell them to
 ;; reload the current page if it has changed (e.g., if you have edited
@@ -758,7 +759,7 @@ for use in `interactive'."
 
 ;;;###autoload
 (defun browse-url-of-file (&optional file)
-  "Ask a WWW browser to display FILE.
+  "Use a web browser to display FILE.
 Display the current buffer's file if FILE is nil or if called
 interactively.  Turn the filename into a URL with function
 `browse-url-file-url'.  Pass the URL to a browser using the
@@ -773,6 +774,8 @@ interactively.  Turn the filename into a URL with function
          (cond ((not (buffer-modified-p)))
                (browse-url-save-file (save-buffer))
                (t (message "%s modified since last save" file))))))
+  (when (file-remote-p file)
+    (setq file (file-local-copy file)))
   (browse-url (browse-url-file-url file))
   (run-hooks 'browse-url-of-file-hook))
 
@@ -793,7 +796,9 @@ Use variable `browse-url-filename-alist' to map filenames 
to URLs."
 
 ;;;###autoload
 (defun browse-url-of-buffer (&optional buffer)
-  "Ask a WWW browser to display BUFFER.
+  "Use a web browser to display BUFFER.
+See `browse-url' for details.
+
 Display the current buffer if BUFFER is nil.  Display only the
 currently visible part of BUFFER (from a temporary file) if buffer is
 narrowed."
@@ -842,7 +847,8 @@ If optional arg TEMP-FILE-NAME is non-nil, delete it 
instead."
 
 ;;;###autoload
 (defun browse-url-of-region (min max)
-  "Ask a WWW browser to display the current region."
+  "Use a web browser to display the current region.
+See `browse-url' for details."
   (interactive "r")
   (save-excursion
     (save-restriction
@@ -856,14 +862,18 @@ If optional arg TEMP-FILE-NAME is non-nil, delete it 
instead."
 
 ;;;###autoload
 (defun browse-url (url &rest args)
-  "Ask a WWW browser to load URL.
-Prompt for a URL, defaulting to the URL at or before point.
-Invokes a suitable browser function which does the actual job.
+  "Open URL using a configurable method.
+This will typically (by default) open URL with an external web
+browser, but a wide variety of different methods can be used,
+depending on the URL type.
 
 The variables `browse-url-browser-function',
 `browse-url-handlers', and `browse-url-default-handlers'
 determine which browser function to use.
 
+This command prompts for a URL, defaulting to the URL at or
+before point.
+
 The additional ARGS are passed to the browser function.  See the
 doc strings of the actual functions, starting with
 `browse-url-browser-function', for information about the
@@ -895,8 +905,8 @@ If ARGS are omitted, the default is to pass
 
 ;;;###autoload
 (defun browse-url-at-point (&optional arg)
-  "Ask a WWW browser to load the URL at or before point.
-Variable `browse-url-browser-function' says which browser to use.
+  "Open URL at point using a configurable method.
+See `browse-url' for details.
 Optional prefix argument ARG non-nil inverts the value of the option
 `browse-url-new-window-flag'."
   (interactive "P")
@@ -937,10 +947,11 @@ opposite of the browser kind of 
`browse-url-browser-function'."
 
 ;;;###autoload
 (defun browse-url-at-mouse (event)
-  "Ask a WWW browser to load a URL clicked with the mouse.
-The URL is the one around or before the position of the mouse click
-but point is not changed.  Variable `browse-url-browser-function'
-says which browser to use."
+  "Use a web browser to load a URL clicked with the mouse.
+See `browse-url' for details.
+
+The URL is the one around or before the position of the mouse
+click but point is not changed."
   (interactive "e")
   (save-excursion
     (mouse-set-point event)
@@ -1113,8 +1124,8 @@ used instead of `browse-url-new-window-flag'."
                                         ",new-window"))
                                   ")"))))))))
     (set-process-sentinel process
-                         `(lambda (process change)
-                            (browse-url-netscape-sentinel process ,url)))))
+                         (lambda (process _change)
+                           (browse-url-netscape-sentinel process url)))))
 
 (function-put 'browse-url-netscape 'browse-url-browser-kind 'external)
 
@@ -1185,8 +1196,8 @@ used instead of `browse-url-new-window-flag'."
                                      ",new-window"))
                                ")"))))))
     (set-process-sentinel process
-                         `(lambda (process change)
-                            (browse-url-mozilla-sentinel process ,url)))))
+                         (lambda (process _change)
+                           (browse-url-mozilla-sentinel process url)))))
 
 (function-put 'browse-url-mozilla 'browse-url-browser-kind 'external)
 
@@ -1303,8 +1314,8 @@ used instead of `browse-url-new-window-flag'."
                             '("--existing"))
                           (list url)))))
     (set-process-sentinel process
-                         `(lambda (process change)
-                            (browse-url-galeon-sentinel process ,url)))))
+                         (lambda (process _change)
+                           (browse-url-galeon-sentinel process url)))))
 
 (function-put 'browse-url-galeon 'browse-url-browser-kind 'external)
 
@@ -1351,8 +1362,8 @@ used instead of `browse-url-new-window-flag'."
                             '("--existing"))
                           (list url)))))
     (set-process-sentinel process
-                         `(lambda (process change)
-                            (browse-url-epiphany-sentinel process ,url)))))
+                         (lambda (process _change)
+                           (browse-url-epiphany-sentinel process url)))))
 
 (function-put 'browse-url-epiphany 'browse-url-browser-kind 'external)
 
@@ -1715,8 +1726,8 @@ from `browse-url-elinks-wrapper'."
          (elinks-ping-process (start-process "elinks-ping" nil
                                              "elinks" "-remote" "ping()")))
       (set-process-sentinel elinks-ping-process
-                           `(lambda (process change)
-                              (browse-url-elinks-sentinel process ,url))))))
+                           (lambda (process _change)
+                             (browse-url-elinks-sentinel process url))))))
 
 (function-put 'browse-url-elinks 'browse-url-browser-kind 'external)
 
@@ -1782,6 +1793,7 @@ external browser instead of the default one."
         (funcall browse-url-secondary-browser-function url)
       (browse-url url))))
 
+;;;###autoload
 (defun browse-url-button-open-url (url)
   "Open URL using `browse-url'.
 If `current-prefix-arg' is non-nil, use
diff --git a/lisp/net/dig.el b/lisp/net/dig.el
index ddbfb95..4f0b0df 100644
--- a/lisp/net/dig.el
+++ b/lisp/net/dig.el
@@ -138,9 +138,14 @@ Buffer should contain output generated by `dig-invoke'."
 ;;;###autoload
 (defun dig (domain &optional
                   query-type query-class query-option dig-option server)
-  "Query addresses of a DOMAIN using dig, by calling `dig-invoke'.
-Optional arguments are passed to `dig-invoke'."
-  (interactive "sHost: ")
+  "Query addresses of a DOMAIN using dig.
+See `dig-invoke' for an explanation for the parameters.
+When called interactively, DOMAIN is prompted for.  If given a prefix,
+also prompt for the QUERY-TYPE parameter."
+  (interactive
+   (list (read-string "Host: ")
+         (and current-prefix-arg
+              (read-string "Query type: "))))
   (pop-to-buffer-same-window
    (dig-invoke domain query-type query-class query-option dig-option server))
   (goto-char (point-min))
diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el
index c112d27..6459c52 100644
--- a/lisp/net/eudc.el
+++ b/lisp/net/eudc.el
@@ -1108,12 +1108,12 @@ queries the server for the existing fields and displays 
a corresponding form."
                                                  proto-name)))
                    (if (not (fboundp command))
                        (fset command
-                             `(lambda ()
-                                (interactive)
-                                (eudc-set-server ,server (quote ,protocol))
-                                (message "Selected directory server is now %s 
(%s)"
-                                         ,server
-                                         ,proto-name))))
+                             (lambda ()
+                               (interactive)
+                               (eudc-set-server server protocol)
+                               (message "Selected directory server is now %s 
(%s)"
+                                        server
+                                        proto-name))))
                    (vector (format "%s (%s)" server proto-name)
                            command
                            :style 'radio
@@ -1129,7 +1129,9 @@ queries the server for the existing fields and displays a 
corresponding form."
     (cons "Directory Servers"
          (easy-menu-create-menu "Directory Servers" (cdr (eudc-menu))))))
 
-;;; Load time initializations :
+;;}}}
+
+;;{{{ Load time initializations
 
 ;; Load the options file
 (if (and (not noninteractive)
diff --git a/lisp/net/imap.el b/lisp/net/imap.el
index d29584e..6ca76f1 100644
--- a/lisp/net/imap.el
+++ b/lisp/net/imap.el
@@ -160,7 +160,6 @@
 %l with the value of `imap-default-user'.  The program should accept
 IMAP commands on stdin and return responses to stdout.  Each entry in
 the list is tried until a successful connection is made."
-  :group 'imap
   :type '(repeat string))
 
 (defcustom imap-gssapi-program (list
@@ -173,7 +172,6 @@ the list is tried until a successful connection is made."
 %l with the value of `imap-default-user'.  The program should accept
 IMAP commands on stdin and return responses to stdout.  Each entry in
 the list is tried until a successful connection is made."
-  :group 'imap
   :type '(repeat string))
 
 (defcustom imap-shell-program '("ssh %s imapd"
@@ -186,7 +184,6 @@ number on server, %g with `imap-shell-host', and %l with
 `imap-default-user'.  The program should read IMAP commands from stdin
 and write IMAP response to stdout.  Each entry in the list is tried
 until a successful connection is made."
-  :group 'imap
   :type '(repeat string))
 
 (defcustom imap-process-connection-type nil
@@ -198,7 +195,6 @@ system has no ptys or if all ptys are busy: then a pipe is 
used
 in any case.  The value takes effect when an IMAP server is
 opened; changing it after that has no effect."
   :version "22.1"
-  :group 'imap
   :type 'boolean)
 
 (defcustom imap-use-utf7 t
@@ -206,7 +202,6 @@ opened; changing it after that has no effect."
 Since the UTF7 decoding currently only decodes into ISO-8859-1
 characters, you may disable this decoding if you need to access UTF7
 encoded mailboxes which doesn't translate into ISO-8859-1."
-  :group 'imap
   :type 'boolean)
 
 (defcustom imap-log nil
@@ -217,7 +212,6 @@ It is not written to disk, however.  Do not enable this
 variable unless you are comfortable with that.
 
 See also `imap-debug'."
-  :group 'imap
   :type 'boolean)
 
 (defcustom imap-debug nil
@@ -232,17 +226,14 @@ variable unless you are comfortable with that.
 
 This variable only takes effect when loading the `imap' library.
 See also `imap-log'."
-  :group 'imap
   :type 'boolean)
 
 (defcustom imap-shell-host "gateway"
   "Hostname of rlogin proxy."
-  :group 'imap
   :type 'string)
 
 (defcustom imap-default-user (user-login-name)
   "Default username to use."
-  :group 'imap
   :type 'string)
 
 (defcustom imap-read-timeout (if (memq system-type '(windows-nt cygwin))
@@ -250,12 +241,10 @@ See also `imap-log'."
                               0.1)
   "How long to wait between checking for the end of output.
 Shorter values mean quicker response, but is more CPU intensive."
-  :type 'number
-  :group 'imap)
+  :type 'number)
 
 (defcustom imap-store-password nil
   "If non-nil, store session password without prompting."
-  :group 'imap
   :type 'boolean)
 
 ;;; Various variables
@@ -987,8 +976,8 @@ t if it successfully authenticates, nil otherwise."
                                    "imap" buffer imap-server imap-port)
                         ((error quit) nil)))
     (when imap-process
-      (set-process-filter imap-process 'imap-arrival-filter)
-      (set-process-sentinel imap-process 'imap-sentinel)
+      (set-process-filter imap-process #'imap-arrival-filter)
+      (set-process-sentinel imap-process #'imap-sentinel)
       (while (and (eq imap-state 'initial)
                  (memq (process-status imap-process) '(open run)))
        (message "Waiting for response from %s..." imap-server)
@@ -1012,7 +1001,7 @@ necessary.  If nil, the buffer name is generated."
   (with-current-buffer (get-buffer-create buffer)
     (if (imap-opened buffer)
        (imap-close buffer))
-    (mapc 'make-local-variable imap-local-variables)
+    (mapc #'make-local-variable imap-local-variables)
     (set-buffer-multibyte nil)
     (buffer-disable-undo)
     (setq imap-server (or server imap-server))
@@ -1034,7 +1023,7 @@ necessary.  If nil, the buffer name is generated."
              ;; Stream changed?
              (if (not (eq imap-default-stream stream))
                   (with-current-buffer (generate-new-buffer " *temp*")
-                   (mapc 'make-local-variable imap-local-variables)
+                   (mapc #'make-local-variable imap-local-variables)
                    (set-buffer-multibyte nil)
                    (buffer-disable-undo)
                    (setq imap-server (or server imap-server))
@@ -1078,7 +1067,6 @@ necessary.  If nil, the buffer name is generated."
   "If non-nil, check if IMAP is open.
 See the function `imap-ping-server'."
   :version "23.1" ;; No Gnus
-  :group 'imap
   :type 'boolean)
 
 (defun imap-opened (&optional buffer)
@@ -1346,16 +1334,16 @@ If BUFFER is nil the current buffer is assumed."
     (when imap-current-mailbox
       (if asynch
          (imap-add-callback (imap-send-command "CLOSE")
-                            `(lambda (tag status)
-                               (message "IMAP mailbox `%s' closed... %s"
-                                        imap-current-mailbox status)
-                               (when (eq ,imap-current-mailbox
-                                         imap-current-mailbox)
-                                 ;; Don't wipe out data if another mailbox
-                                 ;; was selected...
-                                 (setq imap-current-mailbox nil
-                                       imap-message-data nil
-                                       imap-state 'auth))))
+                            (let ((cmb imap-current-mailbox))
+                              (lambda (_tag status)
+                                (message "IMAP mailbox `%s' closed... %s"
+                                         imap-current-mailbox status)
+                                (when (eq cmb imap-current-mailbox)
+                                  ;; Don't wipe out data if another mailbox
+                                  ;; was selected...
+                                  (setq imap-current-mailbox nil
+                                        imap-message-data nil
+                                        imap-state 'auth)))))
        (when (imap-ok-p (imap-send-command-wait "CLOSE"))
          (setq imap-current-mailbox nil
                imap-message-data nil
@@ -1740,8 +1728,8 @@ See `imap-enable-exchange-bug-workaround'."
        (prog1
            (and (imap-fetch-safe '("*" . "*:*") "UID")
                 (list (imap-mailbox-get-1 'uidvalidity mailbox)
-                      (apply 'max (imap-message-map
-                                   (lambda (uid _prop) uid) 'UID))))
+                      (apply #'max (imap-message-map
+                                    (lambda (uid _prop) uid) 'UID))))
          (if old-mailbox
              (imap-mailbox-select old-mailbox (eq state 'examine))
            (imap-mailbox-unselect)))))))
@@ -1786,7 +1774,7 @@ first element.  The rest of list contains the saved 
articles' UIDs."
        (prog1
            (and (imap-fetch-safe '("*" . "*:*") "UID")
                 (list (imap-mailbox-get-1 'uidvalidity mailbox)
-                      (apply 'max (imap-message-map
+                      (apply #'max (imap-message-map
                                    (lambda (uid _prop) uid) 'UID))))
          (if old-mailbox
              (imap-mailbox-select old-mailbox (eq state 'examine))
@@ -1820,7 +1808,7 @@ on failure."
                      (numberp (nth 9 body)))
                 (nth 9 body))
                (t 0))
-       (apply '+ (mapcar 'imap-body-lines body)))
+       (apply #'+ (mapcar #'imap-body-lines body)))
     0))
 
 (defun imap-envelope-from (from)
@@ -2424,7 +2412,7 @@ Return nil if no complete line has arrived."
         (buffer-substring (point) (1- (re-search-forward "[] ]" nil t)))))
     (if (eq (char-before) ? )
        (prog1
-           (mapconcat 'identity (cons section (imap-parse-header-list)) " ")
+           (mapconcat #'identity (cons section (imap-parse-header-list)) " ")
          (search-forward "]" nil t))
       section)))
 
diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el
index 3097c9a..54f7f41 100644
--- a/lisp/net/mailcap.el
+++ b/lisp/net/mailcap.el
@@ -1156,6 +1156,29 @@ current buffer after passing its contents to the shell 
command."
           (mailcap--async-shell method file))
       (funcall method))))
 
+(defun mailcap-view-file (file)
+  "View FILE according to rules given by the mailcap system.
+This normally involves executing some external program to display
+the file.
+
+See \"~/.mailcap\", `mailcap-mime-data' and related files and variables."
+  (interactive "fOpen file with mailcap: ")
+  (setq file (expand-file-name file))
+  (mailcap-parse-mailcaps)
+  (let ((command (mailcap-mime-info
+                  (mailcap-extension-to-mime (file-name-extension file)))))
+    (unless command
+      (error "No viewer for %s" (file-name-extension file)))
+    ;; Remove quotes around the file name - we'll use shell-quote-argument.
+    (while (string-match "['\"]%s['\"]" command)
+      (setq command (replace-match "%s" t t command)))
+    (setq command (replace-regexp-in-string
+                  "%s"
+                  (shell-quote-argument (convert-standard-filename file))
+                  command
+                  nil t))
+    (start-process-shell-command command nil command)))
+
 (provide 'mailcap)
 
 ;;; mailcap.el ends here
diff --git a/lisp/net/mairix.el b/lisp/net/mairix.el
index 024d118..e1d35c2 100644
--- a/lisp/net/mairix.el
+++ b/lisp/net/mairix.el
@@ -328,6 +328,7 @@ Currently there are `threads' and `flags'.")
 
 ;;;; Main interactive functions
 
+;;;###autoload
 (defun mairix-search (search threads)
   "Call Mairix with SEARCH.
 If THREADS is non-nil, also display whole threads of found
@@ -342,6 +343,7 @@ messages.  Results will be put into the default search 
file."
         threads)
     (mairix-show-folder mairix-search-file)))
 
+;;;###autoload
 (defun mairix-use-saved-search ()
   "Use a saved search for querying Mairix."
   (interactive)
@@ -374,6 +376,7 @@ Overwrite existing entry? ")
        (setcdr (assoc name mairix-saved-searches) mairix-last-search))))
   (mairix-select-save))
 
+;;;###autoload
 (defun mairix-edit-saved-searches-customize ()
   "Edit the list of saved searches in a customization buffer."
   (interactive)
@@ -386,6 +389,8 @@ in your .emacs by pressing `Save for Future Sessions'.\n"
 (make-string 65 ?=) "\n")))
 
 (autoload 'mail-strip-quoted-names "mail-utils")
+
+;;;###autoload
 (defun mairix-search-from-this-article (threads)
   "Search messages from sender of the current article.
 This is effectively a shortcut for calling `mairix-search' with
@@ -402,6 +407,7 @@ threads."
         threads)
       (error "No function for obtaining mail header specified"))))
 
+;;;###autoload
 (defun mairix-search-thread-this-article ()
   "Search thread for the current article.
 This is effectively a shortcut for calling `mairix-search'
@@ -423,12 +429,14 @@ with m:msgid of the current article and enabled threads."
     (mairix-search
      (format "m:%s" mid) t)))
 
+;;;###autoload
 (defun mairix-widget-search-based-on-article ()
   "Create mairix query based on current article using widgets."
   (interactive)
   (mairix-widget-search
    (mairix-widget-get-values)))
 
+;;;###autoload
 (defun mairix-edit-saved-searches ()
   "Edit current mairix searches."
   (interactive)
@@ -441,6 +449,7 @@ with m:msgid of the current article and enabled threads."
 
 (defvar mairix-widgets)
 
+;;;###autoload
 (defun mairix-widget-search (&optional mvalues)
   "Create mairix query interactively using graphical widgets.
 MVALUES may contain values from current article."
@@ -470,6 +479,7 @@ MVALUES may contain values from current article."
   (widget-setup)
   (goto-char (point-min)))
 
+;;;###autoload
 (defun mairix-update-database ()
   "Call mairix for updating the database for SERVERS.
 Mairix will be called asynchronously unless
@@ -521,8 +531,11 @@ The mail program is given by `mairix-mail-program'."
 If FILE is nil, use default.  If THREADS is non-nil, also return
 whole threads.  Function returns t if messages were found."
   (let* ((commandsplit (split-string mairix-command))
-        (args (cons (car commandsplit)
-                    `(nil ,(get-buffer-create mairix-output-buffer) nil)))
+        (args (cons
+                (car commandsplit)
+               (append
+                 `(nil ,(get-buffer-create mairix-output-buffer) nil)
+                 mairix-search-options)))
         rval)
     (with-current-buffer mairix-output-buffer
       (erase-buffer))
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index 24f2aba..90cca7d 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -363,24 +363,24 @@ This variable is only used if the variable
       (when proc
         (set-process-filter proc nil)
         (delete-process proc)))
-    (let ((inhibit-read-only t)
-       (coding-system-for-read
-        ;; MS-Windows versions of network utilities output text
-        ;; encoded in the console (a.k.a. "OEM") codepage, which is
-        ;; different from the default system (a.k.a. "ANSI")
-        ;; codepage.
-        (if (eq system-type 'windows-nt)
-            (intern (format "cp%d" (w32-get-console-output-codepage)))
-          coding-system-for-read)))
+    (let ((inhibit-read-only t))
       (erase-buffer))
     (net-utils-mode)
     (setq-local net-utils--revert-cmd
                 `(net-utils-run-simple ,(current-buffer)
                                        ,program-name ,args nodisplay))
-    (set-process-filter
-     (apply #'start-process program-name
-            (current-buffer) program-name args)
-     #'net-utils-remove-ctrl-m-filter)
+    (let ((coding-system-for-read
+          ;; MS-Windows versions of network utilities output text
+          ;; encoded in the console (a.k.a. "OEM") codepage, which is
+          ;; different from the default system (a.k.a. "ANSI")
+          ;; codepage.
+          (if (eq system-type 'windows-nt)
+              (intern (format "cp%d" (w32-get-console-output-codepage)))
+            coding-system-for-read)))
+      (set-process-filter
+       (apply #'start-process program-name
+              (current-buffer) program-name args)
+       #'net-utils-remove-ctrl-m-filter))
     (unless nodisplay (display-buffer (current-buffer)))))
 
 (defun net-utils--revert-function (&optional _ignore-auto _noconfirm)
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 7251640..edbbc1e 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -245,13 +245,15 @@ The ARGUMENTS for each METHOD symbol are:
   `chanserv': NICK CHANNEL PASSWORD
   `bitlbee': NICK PASSWORD
   `quakenet': ACCOUNT PASSWORD
+  `sasl': NICK PASSWORD
 
 Examples:
  ((\"freenode\" nickserv \"bob\" \"p455w0rd\")
   (\"freenode\" chanserv \"bob\" \"#bobland\" \"passwd99\")
   (\"bitlbee\" bitlbee \"robert\" \"sekrit\")
   (\"dal.net\" nickserv \"bob\" \"sekrit\" \"NickServ@services.dal.net\")
-  (\"quakenet.org\" quakenet \"bobby\" \"sekrit\"))"
+  (\"quakenet.org\" quakenet \"bobby\" \"sekrit\")
+  (\"oftc\" sasl \"bob\" \"hunter2\"))"
   :type '(alist :key-type (regexp :tag "Server")
                :value-type (choice (list :tag "NickServ"
                                          (const nickserv)
@@ -269,6 +271,10 @@ Examples:
                                     (list :tag "QuakeNet"
                                           (const quakenet)
                                           (string :tag "Account")
+                                          (string :tag "Password"))
+                                    (list :tag "SASL"
+                                          (const sasl)
+                                          (string :tag "Nick")
                                           (string :tag "Password")))))
 
 (defcustom rcirc-auto-authenticate-flag t
@@ -543,6 +549,22 @@ If ARG is non-nil, instead prompt for connection 
parameters."
 (defvar rcirc-connection-info nil)
 (defvar rcirc-process nil)
 
+(defun rcirc-get-server-method (server)
+  (catch 'method
+    (dolist (i rcirc-authinfo)
+      (let ((server-i (car i))
+           (method (cadr i)))
+       (when (string-match server-i server)
+          (throw 'method method))))))
+
+(defun rcirc-get-server-password (server)
+  (catch 'pass
+    (dolist (i rcirc-authinfo)
+      (let ((server-i (car i))
+           (args (cdddr i)))
+       (when (string-match server-i server)
+          (throw 'pass (car args)))))))
+
 ;;;###autoload
 (defun rcirc-connect (server &optional port nick user-name
                              full-name startup-channels password encryption
@@ -559,6 +581,7 @@ If ARG is non-nil, instead prompt for connection 
parameters."
           (user-name (or user-name rcirc-default-user-name))
           (full-name (or full-name rcirc-default-full-name))
           (startup-channels startup-channels)
+           (use-sasl (eq (rcirc-get-server-method server) 'sasl))
            (process (open-network-stream
                      (or server-alias server) nil server port-number
                      :type (or encryption 'plain))))
@@ -591,6 +614,8 @@ If ARG is non-nil, instead prompt for connection 
parameters."
       (setq-local rcirc-server-parameters nil)
 
       (add-hook 'auto-save-hook 'rcirc-log-write)
+      (when use-sasl
+        (rcirc-send-string process "CAP REQ sasl"))
 
       ;; identify
       (unless (zerop (length password))
@@ -598,6 +623,10 @@ If ARG is non-nil, instead prompt for connection 
parameters."
       (rcirc-send-string process (concat "NICK " nick))
       (rcirc-send-string process (concat "USER " user-name
                                          " 0 * :" full-name))
+      ;; Setup sasl, and initiate authentication.
+      (when (and rcirc-auto-authenticate-flag
+                 use-sasl)
+        (rcirc-send-string process "AUTHENTICATE PLAIN"))
 
       ;; setup ping timer if necessary
       (unless rcirc-keepalive-timer
@@ -2502,7 +2531,8 @@ If ARG is given, opens the URL in a new browser window."
                        'follow-link t
                        'rcirc-url url
                        'action (lambda (button)
-                                 (browse-url (button-get button 'rcirc-url))))
+                                 (browse-url-button-open-url
+                                   (button-get button 'rcirc-url))))
       ;; Record the URL if it is not already the latest stored URL.
       (unless (string= url (caar rcirc-urls))
         (push (cons url start) rcirc-urls)))))
@@ -2922,7 +2952,8 @@ Passwords are stored in `rcirc-authinfo' (which see)."
                  (rcirc-send-privmsg
                   process
                   "&bitlbee"
-                  (concat "IDENTIFY " (car args)))))
+                  (concat "IDENTIFY " (car args))))
+                (sasl nil))
             ;; quakenet authentication doesn't rely on the user's nickname.
             ;; the variable `nick' here represents the Q account name.
             (when (eq method 'quakenet)
@@ -2968,6 +2999,16 @@ Passwords are stored in `rcirc-authinfo' (which see)."
 
 (defun rcirc-handler-CTCP-response (process _target sender message)
   (rcirc-print process sender "CTCP" nil message t))
+
+(defun rcirc-handler-AUTHENTICATE (process _cmd _args _text)
+  (rcirc-send-string
+   process
+   (format "AUTHENTICATE %s"
+           (base64-encode-string
+            ;; use connection user-name
+            (concat "\0" (nth 3 rcirc-connection-info)
+                    "\0" (rcirc-get-server-password rcirc-server))))))
+
 
 (defgroup rcirc-faces nil
   "Faces for rcirc."
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index cbdeb65..873f045 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -1257,20 +1257,20 @@ Return a string with image data."
 CONTENT-FUNCTION is a function to retrieve an image for a cid url that
 is an argument.  The function to be returned takes three arguments URL,
 START, and END.  Note that START and END should be markers."
-  `(lambda (url start end)
-     (when url
-       (if (string-match "\\`cid:" url)
-          ,(when content-function
-             `(let ((image (funcall ,content-function
-                                    (substring url (match-end 0)))))
-                (when image
-                  (goto-char start)
-                  (funcall shr-put-image-function
-                           image (buffer-substring start end))
-                  (delete-region (point) end))))
-         (url-retrieve url #'shr-image-fetched
-                      (list (current-buffer) start end)
-                      t t)))))
+  (lambda (url start end)
+    (when url
+      (if (string-match "\\`cid:" url)
+         (when content-function
+           (let ((image (funcall content-function
+                                 (substring url (match-end 0)))))
+             (when image
+               (goto-char start)
+               (funcall shr-put-image-function
+                        image (buffer-substring start end))
+               (delete-region (point) end))))
+        (url-retrieve url #'shr-image-fetched
+                     (list (current-buffer) start end)
+                     t t)))))
 
 (defun shr-heading (dom &rest types)
   (shr-ensure-paragraph)
diff --git a/lisp/net/sieve-manage.el b/lisp/net/sieve-manage.el
index 5dad5f4..1f08a15 100644
--- a/lisp/net/sieve-manage.el
+++ b/lisp/net/sieve-manage.el
@@ -89,18 +89,15 @@
 
 (defcustom sieve-manage-log "*sieve-manage-log*"
   "Name of buffer for managesieve session trace."
-  :type 'string
-  :group 'sieve-manage)
+  :type 'string)
 
 (defcustom sieve-manage-server-eol "\r\n"
   "The EOL string sent from the server."
-  :type 'string
-  :group 'sieve-manage)
+  :type 'string)
 
 (defcustom sieve-manage-client-eol "\r\n"
   "The EOL string we send to the server."
-  :type 'string
-  :group 'sieve-manage)
+  :type 'string)
 
 (defcustom sieve-manage-authenticators '(digest-md5
                                         cram-md5
@@ -112,8 +109,7 @@
   ;; FIXME Improve this.  It's not `set'.
   ;; It's like (repeat (choice (const ...))), where each choice can
   ;; only appear once.
-  :type '(repeat symbol)
-  :group 'sieve-manage)
+  :type '(repeat symbol))
 
 (defcustom sieve-manage-authenticator-alist
   '((cram-md5   sieve-manage-cram-md5-p       sieve-manage-cram-md5-auth)
@@ -130,26 +126,22 @@ NAME names the authenticator.  CHECK is a function 
returning non-nil if
 the server support the authenticator and AUTHENTICATE is a function
 for doing the actual authentication."
   :type '(repeat (list (symbol :tag "Name") (function :tag "Check function")
-                      (function :tag "Authentication function")))
-  :group 'sieve-manage)
+                      (function :tag "Authentication function"))))
 
 (defcustom sieve-manage-default-port "sieve"
   "Default port number or service name for managesieve protocol."
   :type '(choice integer string)
-  :version "24.4"
-  :group 'sieve-manage)
+  :version "24.4")
 
 (defcustom sieve-manage-default-stream 'network
   "Default stream type to use for `sieve-manage'."
   :version "24.1"
-  :type 'symbol
-  :group 'sieve-manage)
+  :type 'symbol)
 
 (defcustom sieve-manage-ignore-starttls nil
   "Ignore STARTTLS even if STARTTLS capability is provided."
   :version "26.1"
-  :type 'boolean
-  :group 'sieve-manage)
+  :type 'boolean)
 
 ;; Internal variables:
 
@@ -247,7 +239,7 @@ Return the buffer associated with the connection."
            (sasl-read-passphrase
             ;; We *need* to copy the password, because sasl will modify it
             ;; somehow.
-            `(lambda (prompt) ,(copy-sequence user-password)))
+            (lambda (_prompt) (copy-sequence user-password)))
            (step (sasl-next-step client nil))
            (_tag (sieve-manage-send
                  (concat
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index aacf83e..7fb0ff5 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -549,8 +549,7 @@ But handle the case, if the \"test\" command is not 
available."
       (when (and append (file-exists-p filename))
        (copy-file filename tmpfile 'ok)
        (set-file-modes tmpfile (logior (or (file-modes tmpfile) 0) #o0600)))
-      (tramp-run-real-handler
-       #'write-region (list start end tmpfile append 'no-message lockname))
+      (write-region start end tmpfile append 'no-message lockname)
       (with-tramp-progress-reporter
         v 3 (format-message
              "Moving tmp file `%s' to `%s'" tmpfile filename)
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 61c40ff..d723fd5 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -328,6 +328,8 @@ arguments to pass to the OPERATION."
         ;; `filename' could be a quoted file name.  Or the file
         ;; archive could be a directory, see Bug#30293.
         (if (or (null archive)
+                (not (tramp-archive-run-real-handler
+                      #'file-exists-p (list archive)))
                (tramp-archive-run-real-handler
                  #'file-directory-p (list archive)))
             (tramp-archive-run-real-handler operation args)
@@ -345,8 +347,17 @@ arguments to pass to the OPERATION."
              (tramp-archive-run-real-handler operation args)))))))
 
 ;;;###autoload
-(defalias
-  'tramp-archive-autoload-file-name-handler #'tramp-autoload-file-name-handler)
+(progn (defun tramp-archive-autoload-file-name-handler (operation &rest args)
+  "Load Tramp archive file name handler, and perform OPERATION."
+  (when tramp-archive-enabled
+    ;; We cannot use `tramp-compat-temporary-file-directory' here due
+    ;; to autoload.  When installing Tramp's GNU ELPA package, there
+    ;; might be an older, incompatible version active.  We try to
+    ;; overload this.
+    (let ((default-directory temporary-file-directory)
+          (tramp-archive-autoload t))
+      tramp-archive-autoload ; Silence byte compiler.
+      (apply #'tramp-autoload-file-name-handler operation args)))))
 
 ;;;###autoload
 (progn (defun tramp-register-archive-file-name-handler ()
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index 2fcb7b1..a41620a 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -70,7 +70,8 @@
 ;;   process key retrieved by `tramp-get-process' (the main connection
 ;;   process).  Other processes could reuse these properties, avoiding
 ;;   recomputation when a new asynchronous process is created by
-;;   `make-process'.  Examples are "remote-path" or "device" (tramp-adb.el).
+;;   `make-process'.  Examples are "remote-path",
+;;   "unsafe-temporary-file" or "device" (tramp-adb.el).
 
 ;;; Code:
 
@@ -237,8 +238,7 @@ Return VALUE."
 ;;;###tramp-autoload
 (defun tramp-flush-file-properties (key file)
   "Remove all properties of FILE in the cache context of KEY."
-  (let* ((file (tramp-run-real-handler
-               #'directory-file-name (list file)))
+  (let* ((file (tramp-run-real-handler #'directory-file-name (list file)))
         (truename (tramp-get-file-property key file "file-truename" nil)))
     ;; Unify localname.  Remove hop from `tramp-file-name' structure.
     (setq file (tramp-compat-file-name-unquote file)
@@ -471,11 +471,11 @@ used to cache connection properties of the local machine."
        ;; don't save either, because all other properties might
        ;; depend on the login name, and we want to give the
        ;; possibility to use another login name later on.  Key
-       ;; "started" exists for the "ftp" method only, which must be
+       ;; "started" exists for the "ftp" method only, which must not
        ;; be kept persistent.
        (maphash
         (lambda (key value)
-          (if (and (tramp-file-name-p key) value
+          (if (and (tramp-file-name-p key) (hash-table-p value)
                    (not (string-equal
                          (tramp-file-name-method key) tramp-archive-method))
                    (not (tramp-file-name-localname key))
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index a3cf6f3..d30d220 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -57,7 +57,9 @@ SYNTAX can be one of the symbols `default' (default),
    (all-completions
     "*tramp" (mapcar #'list (mapcar #'buffer-name (buffer-list))))
    (all-completions
-    "*debug tramp" (mapcar #'list (mapcar #'buffer-name (buffer-list))))))
+    "*debug tramp" (mapcar #'list (mapcar #'buffer-name (buffer-list))))
+   (all-completions
+    "*trace tramp" (mapcar #'list (mapcar #'buffer-name (buffer-list))))))
 
 (defun tramp-list-remote-buffers ()
   "Return a list of all buffers with remote `default-directory'."
@@ -496,7 +498,7 @@ This is needed if there are compatibility problems."
       ((dir (tramp-compat-funcall
             'package-desc-dir
             (car (alist-get 'tramp (bound-and-true-p package-alist))))))
-    (dolist (elc (directory-files dir 'full "\\.elc$"))
+    (dolist (elc (directory-files dir 'full "\\.elc\\'"))
       (delete-file elc))
     (with-current-buffer (get-buffer-create byte-compile-log-buffer)
       (let ((inhibit-read-only t))
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index b67de1b..54cfb6f 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -63,8 +63,6 @@
   `(when (functionp ,function)
      (with-no-warnings (funcall ,function ,@arguments))))
 
-(put #'tramp-compat-funcall 'tramp-suppress-trace t)
-
 (defsubst tramp-compat-temporary-file-directory ()
   "Return name of directory for temporary files.
 It is the default value of `temporary-file-directory'."
@@ -355,6 +353,9 @@ A nil value for either argument stands for the current 
time."
     (lambda (fromstring tostring instring)
       (replace-regexp-in-string (regexp-quote fromstring) tostring instring))))
 
+(dolist (elt (all-completions "tramp-compat-" obarray 'functionp))
+  (put (intern elt) 'tramp-suppress-trace t))
+
 (add-hook 'tramp-unload-hook
          (lambda ()
            (unload-feature 'tramp-loaddefs 'force)
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index c4ec112..f1d24dc 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -1089,7 +1089,7 @@ file names."
        'copy filename newname ok-if-already-exists keep-date
        preserve-uid-gid preserve-extended-attributes)
     (tramp-run-real-handler
-     'copy-file
+     #'copy-file
      (list filename newname ok-if-already-exists keep-date
           preserve-uid-gid preserve-extended-attributes))))
 
diff --git a/lisp/net/tramp-integration.el b/lisp/net/tramp-integration.el
index 2931b4f..17264193 100644
--- a/lisp/net/tramp-integration.el
+++ b/lisp/net/tramp-integration.el
@@ -42,6 +42,8 @@
 (declare-function tramp-dissect-file-name "tramp")
 (declare-function tramp-file-name-equal-p "tramp")
 (declare-function tramp-tramp-file-p "tramp")
+(declare-function tramp-rename-files "tramp-cmds")
+(declare-function tramp-rename-these-files "tramp-cmds")
 (defvar eshell-path-env)
 (defvar ido-read-file-name-non-ido)
 (defvar info-lookup-alist)
@@ -184,14 +186,14 @@ NAME must be equal to `tramp-current-connection'."
 ;;; Integration of ido.el:
 
 (with-eval-after-load 'ido
-  (add-to-list 'ido-read-file-name-non-ido 'tramp-rename-files)
-  (add-to-list 'ido-read-file-name-non-ido 'tramp-these-rename-files)
+  (add-to-list 'ido-read-file-name-non-ido #'tramp-rename-files)
+  (add-to-list 'ido-read-file-name-non-ido #'tramp-rename-these-files)
   (add-hook 'tramp-integration-unload-hook
            (lambda ()
              (setq ido-read-file-name-non-ido
-                   (delq 'tramp-these-rename-files ido-read-file-name-non-ido)
+                   (delq #'tramp-rename-these-files ido-read-file-name-non-ido)
                    ido-read-file-name-non-ido
-                   (delq 'tramp-rename-files ido-read-file-name-non-ido)))))
+                   (delq #'tramp-rename-files ido-read-file-name-non-ido)))))
 
 ;;; Integration of ivy.el:
 
@@ -199,17 +201,17 @@ NAME must be equal to `tramp-current-connection'."
   (add-to-list 'ivy-completing-read-handlers-alist
               '(tramp-rename-files . completing-read-default))
   (add-to-list 'ivy-completing-read-handlers-alist
-              '(tramp-these-rename-files . completing-read-default))
+              '(tramp-rename-these-files . completing-read-default))
   (add-hook
    'tramp-integration-unload-hook
    (lambda ()
      (setq ivy-completing-read-handlers-alist
           (delete
-           (assq 'tramp-these-rename-files ivy-completing-read-handlers-alist)
+           (assq #'tramp-rename-these-files ivy-completing-read-handlers-alist)
            ivy-completing-read-handlers-alist)
           ivy-completing-read-handlers-alist
           (delete
-           (assq 'tramp-rename-files ivy-completing-read-handlers-alist)
+           (assq #'tramp-rename-files ivy-completing-read-handlers-alist)
            ivy-completing-read-handlers-alist)))))
 
 ;;; Integration of info-look.el:
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index b51ba11..88caa2f 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -125,6 +125,15 @@ depends on the installed local ssh version.
 
 The string is used in `tramp-methods'.")
 
+(defvar tramp-scp-strict-file-name-checking nil
+  "Which scp strict file name checking argument to use.
+
+It is the string \"-T\" if supported by the local scp (since
+release 8.0), otherwise the string \"\".  If it is nil, it will
+be auto-detected by Tramp.
+
+The string is used in `tramp-methods'.")
+
 ;; Initialize `tramp-methods' with the supported methods.
 ;;;###tramp-autoload
 (tramp--with-startup
@@ -160,8 +169,8 @@ The string is used in `tramp-methods'.")
                 (tramp-remote-shell-login   ("-l"))
                 (tramp-remote-shell-args    ("-c"))
                 (tramp-copy-program         "scp")
-                (tramp-copy-args            (("-P" "%p") ("-p" "%k") ("-q")
-                                            ("-r") ("%c")))
+                (tramp-copy-args            (("-P" "%p") ("-p" "%k")
+                                            ("%x") ("-q") ("-r") ("%c")))
                 (tramp-copy-keep-date       t)
                 (tramp-copy-recursive       t)))
  (add-to-list 'tramp-methods
@@ -177,7 +186,7 @@ The string is used in `tramp-methods'.")
                 (tramp-remote-shell-args    ("-c"))
                 (tramp-copy-program         "scp")
                 (tramp-copy-args            (("-P" "%p") ("-p" "%k")
-                                            ("-q") ("-r") ("%c")))
+                                            ("%x") ("-q") ("-r") ("%c")))
                 (tramp-copy-keep-date       t)
                 (tramp-copy-recursive       t)))
  (add-to-list 'tramp-methods
@@ -1834,7 +1843,7 @@ ID-FORMAT valid values are `string' and `integer'."
        'copy filename newname ok-if-already-exists keep-date
        preserve-uid-gid preserve-extended-attributes)
     (tramp-run-real-handler
-     'copy-file
+     #'copy-file
      (list filename newname ok-if-already-exists keep-date
           preserve-uid-gid preserve-extended-attributes))))
 
@@ -1875,7 +1884,7 @@ ID-FORMAT valid values are `string' and `integer'."
 
        ;; We must do it file-wise.
        (tramp-run-real-handler
-        'copy-directory
+        #'copy-directory
         (list dirname newname keep-date parents copy-contents)))
 
       ;; When newname did exist, we have wrong cached values.
@@ -2279,7 +2288,8 @@ The method used must be an out-of-band method."
              spec (list
                    ?h (or host "") ?u (or user "") ?p (or port "")
                    ?r listener ?c options ?k (if keep-date " " "")
-                    ?n (concat "2>" (tramp-get-remote-null-device v)))
+                    ?n (concat "2>" (tramp-get-remote-null-device v))
+                   ?x (tramp-scp-strict-file-name-checking v))
              copy-program (tramp-get-method-parameter v 'tramp-copy-program)
              copy-keep-date (tramp-get-method-parameter
                              v 'tramp-copy-keep-date)
@@ -2361,11 +2371,12 @@ The method used must be an out-of-band method."
                 ;; can be handled.  We don't set a timeout, because
                 ;; the copying of large files can last longer than 60
                 ;; secs.
-                p (apply
-                   #'start-process
-                   (tramp-get-connection-name v)
-                   (tramp-get-connection-buffer v)
-                   copy-program copy-args))
+                p (let ((default-directory 
(tramp-compat-temporary-file-directory)))
+                    (apply
+                     #'start-process
+                     (tramp-get-connection-name v)
+                     (tramp-get-connection-buffer v)
+                     copy-program copy-args)))
                (tramp-message orig-vec 6 "%s" (string-join (process-command p) 
" "))
                (process-put p 'vector orig-vec)
                (process-put p 'adjust-window-size-function #'ignore)
@@ -2656,69 +2667,75 @@ the result will be a local, non-Tramp, file name."
   (setq dir (or dir default-directory "/"))
   ;; Handle empty NAME.
   (when (zerop (length name)) (setq name "."))
-  ;; Unless NAME is absolute, concat DIR and NAME.
-  (unless (file-name-absolute-p name)
-    (setq name (concat (file-name-as-directory dir) name)))
-  ;; If connection is not established yet, run the real handler.
-  (if (not (tramp-connectable-p name))
-      (tramp-run-real-handler #'expand-file-name (list name nil))
-    ;; Dissect NAME.
-    (with-parsed-tramp-file-name name nil
-      (unless (tramp-run-real-handler #'file-name-absolute-p (list localname))
-       (setq localname (concat "~/" localname)))
-      ;; Tilde expansion if necessary.  This needs a shell which
-      ;; groks tilde expansion!  The function `tramp-find-shell' is
-      ;; supposed to find such a shell on the remote host.  Please
-      ;; tell me about it when this doesn't work on your system.
-      (when (string-match "\\`\\(~[^/]*\\)\\(.*\\)\\'" localname)
-       (let ((uname (match-string 1 localname))
-             (fname (match-string 2 localname)))
-         ;; We cannot simply apply "~/", because under sudo "~/" is
-         ;; expanded to the local user home directory but to the
-         ;; root home directory.  On the other hand, using always
-         ;; the default user name for tilde expansion is not
-         ;; appropriate either, because ssh and companions might
-         ;; use a user name from the config file.
-         (when (and (string-equal uname "~")
-                    (string-match-p "\\`su\\(do\\)?\\'" method))
-           (setq uname (concat uname user)))
-         (setq uname
-               (with-tramp-connection-property v uname
-                 (tramp-send-command
-                  v (format "cd %s && pwd" (tramp-shell-quote-argument uname)))
-                 (with-current-buffer (tramp-get-buffer v)
-                   (goto-char (point-min))
-                   (buffer-substring (point) (point-at-eol)))))
-         (setq localname (concat uname fname))))
-      ;; There might be a double slash, for example when "~/"
-      ;; expands to "/".  Remove this.
-      (while (string-match "//" localname)
-       (setq localname (replace-match "/" t t localname)))
-      ;; Do not keep "/..".
-      (when (string-match-p "^/\\.\\.?$" localname)
-       (setq localname "/"))
-      ;; No tilde characters in file name, do normal
-      ;; `expand-file-name' (this does "/./" and "/../").
-      ;; `default-directory' is bound, because on Windows there would
-      ;; be problems with UNC shares or Cygwin mounts.
-      (let ((default-directory (tramp-compat-temporary-file-directory)))
-       (tramp-make-tramp-file-name
-        v (tramp-drop-volume-letter
-           (tramp-run-real-handler
-            #'expand-file-name (list localname))))))))
+  ;; On MS Windows, some special file names are not returned properly
+  ;; by `file-name-absolute-p'.
+  (if (and (eq system-type 'windows-nt)
+          (string-match-p
+           (concat "^\\([[:alpha:]]:\\|" null-device "$\\)") name))
+      (tramp-run-real-handler #'expand-file-name (list name dir))
+    ;; Unless NAME is absolute, concat DIR and NAME.
+    (unless (file-name-absolute-p name)
+      (setq name (concat (file-name-as-directory dir) name)))
+    ;; If connection is not established yet, run the real handler.
+    (if (not (tramp-connectable-p name))
+       (tramp-run-real-handler #'expand-file-name (list name nil))
+      ;; Dissect NAME.
+      (with-parsed-tramp-file-name name nil
+       (unless (tramp-run-real-handler #'file-name-absolute-p (list localname))
+         (setq localname (concat "~/" localname)))
+       ;; Tilde expansion if necessary.  This needs a shell which
+       ;; groks tilde expansion!  The function `tramp-find-shell' is
+       ;; supposed to find such a shell on the remote host.  Please
+       ;; tell me about it when this doesn't work on your system.
+       (when (string-match "\\`\\(~[^/]*\\)\\(.*\\)\\'" localname)
+         (let ((uname (match-string 1 localname))
+               (fname (match-string 2 localname)))
+           ;; We cannot simply apply "~/", because under sudo "~/" is
+           ;; expanded to the local user home directory but to the
+           ;; root home directory.  On the other hand, using always
+           ;; the default user name for tilde expansion is not
+           ;; appropriate either, because ssh and companions might
+           ;; use a user name from the config file.
+           (when (and (string-equal uname "~")
+                      (string-match-p "\\`su\\(do\\)?\\'" method))
+             (setq uname (concat uname user)))
+           (setq uname
+                 (with-tramp-connection-property v uname
+                   (tramp-send-command
+                    v
+                    (format "cd %s && pwd" (tramp-shell-quote-argument uname)))
+                   (with-current-buffer (tramp-get-buffer v)
+                     (goto-char (point-min))
+                     (buffer-substring (point) (point-at-eol)))))
+           (setq localname (concat uname fname))))
+       ;; There might be a double slash, for example when "~/"
+       ;; expands to "/".  Remove this.
+       (while (string-match "//" localname)
+         (setq localname (replace-match "/" t t localname)))
+       ;; Do not keep "/..".
+       (when (string-match-p "^/\\.\\.?$" localname)
+         (setq localname "/"))
+       ;; No tilde characters in file name, do normal
+       ;; `expand-file-name' (this does "/./" and "/../").
+       ;; `default-directory' is bound, because on Windows there
+       ;; would be problems with UNC shares or Cygwin mounts.
+       (let ((default-directory (tramp-compat-temporary-file-directory)))
+         (tramp-make-tramp-file-name
+          v (tramp-drop-volume-letter
+             (tramp-run-real-handler
+              #'expand-file-name (list localname)))))))))
 
 ;;; Remote commands:
 
 ;; We use BUFFER also as connection buffer during setup. Because of
 ;; this, its original contents must be saved, and restored once
 ;; connection has been setup.
-;; The complete STDERR buffer is available only when the process has
-;; terminated.
 (defun tramp-sh-handle-make-process (&rest args)
   "Like `make-process' for Tramp files.
-STDERR can also be a file name.  If method parameter `tramp-direct-async'
-and connection property \"direct-async-process\" are non-nil, an
-alternative implementation will be used."
+STDERR can also be a remote file name.  If method parameter
+`tramp-direct-async' and connection property
+\"direct-async-process\" are non-nil, an alternative
+implementation will be used."
   (if (tramp-direct-async-process-p args)
       (apply #'tramp-handle-make-process args)
     (when args
@@ -2752,7 +2769,7 @@ alternative implementation will be used."
            (signal 'wrong-type-argument (list #'functionp sentinel)))
          (unless (or (null stderr) (bufferp stderr) (stringp stderr))
            (signal 'wrong-type-argument (list #'bufferp stderr)))
-         (when (and (stringp stderr) (tramp-tramp-file-p stderr)
+         (when (and (stringp stderr)
                     (not (tramp-equal-remote default-directory stderr)))
            (signal 'file-error (list "Wrong stderr" stderr)))
 
@@ -2764,9 +2781,9 @@ alternative implementation will be used."
                 ;; STDERR can also be a file name.
                 (tmpstderr
                  (and stderr
-                      (if (and (stringp stderr) (tramp-tramp-file-p stderr))
-                          (tramp-unquote-file-local-name stderr)
-                        (tramp-make-tramp-temp-file v))))
+                      (tramp-unquote-file-local-name
+                       (if (stringp stderr)
+                           stderr (tramp-make-tramp-temp-name v)))))
                 (remote-tmpstderr
                  (and tmpstderr (tramp-make-tramp-file-name v tmpstderr)))
                 (program (car command))
@@ -2775,7 +2792,8 @@ alternative implementation will be used."
                 ;; "-c", it might be that the arguments exceed the
                 ;; command line length.  Therefore, we modify the
                 ;; command.
-                (heredoc (and (stringp program)
+                (heredoc (and (not (bufferp stderr))
+                              (stringp program)
                               (string-match-p "sh$" program)
                               (= (length args) 2)
                               (string-equal "-c" (car args))
@@ -2839,6 +2857,23 @@ alternative implementation will be used."
                 tramp-current-connection
                 p)
 
+           ;; Handle error buffer.
+           (when (bufferp stderr)
+             (with-current-buffer stderr
+               (setq buffer-read-only nil))
+             ;; Create named pipe.
+             (tramp-send-command v (format "mknod %s p" tmpstderr))
+             ;; Create stderr process.
+             (make-process
+              :name (buffer-name stderr)
+              :buffer stderr
+              :command `("cat" ,tmpstderr)
+              :coding coding
+              :noquery t
+              :filter nil
+              :sentinel #'ignore
+              :file-handler t))
+
            (while (get-process name1)
              ;; NAME must be unique as process name.
              (setq i (1+ i)
@@ -2867,14 +2902,11 @@ alternative implementation will be used."
                             (if (symbolp coding) coding (cdr coding))))
                        (clear-visited-file-modtime)
                        (narrow-to-region (point-max) (point-max))
-                       ;; We call `tramp-maybe-open-connection', in
-                       ;; order to cleanup the prompt afterwards.
                        (catch 'suppress
-                         (tramp-maybe-open-connection v)
-                         (setq p (tramp-get-connection-process v))
                          ;; Set the pid of the remote shell.  This is
                          ;; needed when sending signals remotely.
                          (let ((pid (tramp-send-command-and-read v "echo $$")))
+                           (setq p (tramp-get-connection-process v))
                            (process-put p 'remote-pid pid)
                            (tramp-set-connection-property p "remote-pid" pid))
                          ;; `tramp-maybe-open-connection' and
@@ -2904,38 +2936,16 @@ alternative implementation will be used."
                        (ignore-errors
                          (set-process-query-on-exit-flag p (null noquery))
                          (set-marker (process-mark p) (point)))
-                       ;; We must flush them here already; otherwise
-                       ;; `rename-file', `delete-file' or
-                       ;; `insert-file-contents' will fail.
-                       (tramp-flush-connection-property v "process-name")
-                       (tramp-flush-connection-property v "process-buffer")
-                       ;; Copy tmpstderr file.
-                       (when (and (stringp stderr)
-                                  (not (tramp-tramp-file-p stderr)))
-                         (add-function
-                          :after (process-sentinel p)
-                          (lambda (_proc _msg)
-                            (rename-file remote-tmpstderr stderr))))
-                       ;; Provide error buffer.  This shows only
-                       ;; initial error messages; messages arriving
-                       ;; later on will be inserted when the process
-                       ;; is deleted.  The temporary file will exist
-                       ;; until the process is deleted.
+                       ;; Kill stderr process delete and named pipe.
                        (when (bufferp stderr)
-                         (with-current-buffer stderr
-                           ;; There's a mysterious error, see
-                           ;; <https://github.com/joaotavora/eglot/issues/662>.
-                           (ignore-errors
-                             (insert-file-contents-literally 
remote-tmpstderr)))
-                         ;; Delete tmpstderr file.
                          (add-function
                           :after (process-sentinel p)
                           (lambda (_proc _msg)
-                            (when (file-exists-p remote-tmpstderr)
-                              (with-current-buffer stderr
-                                (ignore-errors
-                                  (insert-file-contents-literally
-                                   remote-tmpstderr nil nil nil 'replace)))
+                            (ignore-errors
+                              (while (accept-process-output
+                                      (get-buffer-process stderr) 0 nil t))
+                              (delete-process (get-buffer-process stderr)))
+                            (ignore-errors
                               (delete-file remote-tmpstderr)))))
                        ;; Return process.
                        p)))
@@ -3222,7 +3232,6 @@ alternative implementation will be used."
       (run-hooks 'tramp-handle-file-local-copy-hook)
       tmpfile)))
 
-;; CCC grok LOCKNAME
 (defun tramp-sh-handle-write-region
   (start end filename &optional append visit lockname mustbenew)
   "Like `write-region' for Tramp files."
@@ -3251,9 +3260,7 @@ alternative implementation will be used."
                  (or (file-directory-p localname)
                      (file-writable-p localname)))))
          ;; Short track: if we are on the local host, we can run directly.
-         (tramp-run-real-handler
-          #'write-region
-          (list start end localname append 'no-message lockname))
+         (write-region start end localname append 'no-message lockname)
 
        (let* ((modes (tramp-default-file-modes
                       filename (and (eq mustbenew 'excl) 'nofollow)))
@@ -3286,13 +3293,10 @@ alternative implementation will be used."
          ;; file.  We call `set-visited-file-modtime' ourselves later
          ;; on.  We must ensure that `file-coding-system-alist'
          ;; matches `tmpfile'.
-         (let (file-name-handler-alist
-               (file-coding-system-alist
+         (let ((file-coding-system-alist
                 (tramp-find-file-name-coding-system-alist filename tmpfile)))
            (condition-case err
-               (tramp-run-real-handler
-                #'write-region
-                (list start end tmpfile append 'no-message lockname))
+               (write-region start end tmpfile append 'no-message lockname)
              ((error quit)
               (setq tramp-temp-buffer-file-name nil)
               (delete-file tmpfile)
@@ -4737,6 +4741,31 @@ Goes through the list `tramp-inline-compress-commands'."
                                  " -o ControlPersist=no")))))))))
       tramp-ssh-controlmaster-options)))
 
+(defun tramp-scp-strict-file-name-checking (vec)
+  "Return the strict file name checking argument of the local scp."
+  (cond
+   ;; No options to be computed.
+   ((null (assoc "%x" (tramp-get-method-parameter vec 'tramp-copy-args)))
+    "")
+
+   ;; There is already a value to be used.
+   ((stringp tramp-scp-strict-file-name-checking)
+    tramp-scp-strict-file-name-checking)
+
+   ;; Determine the options.
+   (t (setq tramp-scp-strict-file-name-checking "")
+      (let ((case-fold-search t))
+       (ignore-errors
+         (when (executable-find "scp")
+           (with-tramp-progress-reporter
+               vec 4 "Computing strict file name argument"
+             (with-temp-buffer
+               (tramp-call-process vec "scp" nil t nil "-T")
+               (goto-char (point-min))
+               (unless (search-forward-regexp "unknown option -- T" nil t)
+                 (setq tramp-scp-strict-file-name-checking "-T")))))))
+      tramp-scp-strict-file-name-checking)))
+
 (defun tramp-timeout-session (vec)
   "Close the connection VEC after a session timeout.
 If there is just some editing, retry it after 5 seconds."
@@ -4801,10 +4830,12 @@ connection if a previous connection has died for some 
reason."
          (with-tramp-progress-reporter
              vec 3
              (if (zerop (length (tramp-file-name-user vec)))
-                 (format "Opening connection for %s using %s"
+                 (format "Opening connection %s for %s using %s"
+                         process-name
                          (tramp-file-name-host vec)
                          (tramp-file-name-method vec))
-               (format "Opening connection for %s@%s using %s"
+               (format "Opening connection %s for %s@%s using %s"
+                       process-name
                        (tramp-file-name-user vec)
                        (tramp-file-name-host vec)
                        (tramp-file-name-method vec)))
@@ -5229,12 +5260,11 @@ Return ATTR."
         (directory-file-name (tramp-file-name-unquote-localname vec))))
     (when (string-match-p tramp-ipv6-regexp host)
       (setq host (format "[%s]" host)))
-    ;; This does not work yet for MS Windows scp, if there are
-    ;; characters to be quoted.  Win32 OpenSSH 7.9 is said to support
-    ;; this, see
-    ;; 
<https://github.com/PowerShell/Win32-OpenSSH/releases/tag/v7.9.0.0p1-Beta>
+    ;; This does not work for MS Windows scp, if there are characters
+    ;; to be quoted.  OpenSSH 8 supports disabling of strict file name
+    ;; checking in scp, we use it when available.
     (unless (string-match-p "ftp$" method)
-      (setq localname (tramp-shell-quote-argument localname)))
+      (setq localname (tramp-unquote-shell-quote-argument localname)))
     (cond
      ((tramp-get-method-parameter vec 'tramp-remote-copy-program)
       localname)
@@ -5267,8 +5297,7 @@ Nonexistent directories are removed from spec."
        ;; cache the result for the session only.  Otherwise, the
        ;; result is cached persistently.
        (if (memq 'tramp-own-remote-path tramp-remote-path)
-           (tramp-get-process vec)
-         vec)
+           (tramp-get-process vec) vec)
        "remote-path"
       (let* ((remote-path (copy-tree tramp-remote-path))
             (elt1 (memq 'tramp-default-remote-path remote-path))
@@ -5905,8 +5934,6 @@ function cell is returned to be applied on a buffer."
 ;;   session could be reused after a connection loss.  Use dtach, or
 ;;   screen, or tmux, or mosh.
 ;;
-;; * Implement `:stderr' of `make-process' as pipe process.
-
 ;; * One interesting solution (with other applications as well) would
 ;;   be to stipulate, as a directory or connection-local variable, an
 ;;   additional rc file on the remote machine that is sourced every
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 66737e6..d641709 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -650,7 +650,7 @@ component is used as the target of the symlink."
        'rename filename newname ok-if-already-exists
        'keep-date 'preserve-uid-gid)
     (tramp-run-real-handler
-     'rename-file (list filename newname ok-if-already-exists))))
+     #'rename-file (list filename newname ok-if-already-exists))))
 
 (defun tramp-sudoedit-handle-set-file-acl (filename acl-string)
   "Like `set-file-acl' for Tramp files."
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 015f458..75e4455 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -109,7 +109,8 @@ Any level x includes messages for all levels 1 .. x-1.  The 
levels are
  7  file caching
  8  connection properties
  9  test commands
-10  traces (huge)."
+10  traces (huge)
+11  call traces (maintainer only)."
   :type 'integer)
 
 (defcustom tramp-debug-to-file nil
@@ -252,6 +253,8 @@ pair of the form (KEY VALUE).  The following KEYs are 
defined:
     - \"%c\" adds additional `tramp-ssh-controlmaster-options'
       options for the first hop.
     - \"%n\" expands to \"2>/dev/null\".
+    - \"%x\" is replaced by the `tramp-scp-strict-file-name-checking'
+      argument if it is supported.
 
     The existence of `tramp-login-args', combined with the
     absence of `tramp-copy-args', is an indication that the
@@ -1388,6 +1391,14 @@ calling HANDLER.")
 (cl-defstruct (tramp-file-name (:type list) :named)
   method user domain host port localname hop)
 
+(put #'tramp-file-name-method 'tramp-suppress-trace t)
+(put #'tramp-file-name-user 'tramp-suppress-trace t)
+(put #'tramp-file-name-domain 'tramp-suppress-trace t)
+(put #'tramp-file-name-host 'tramp-suppress-trace t)
+(put #'tramp-file-name-port 'tramp-suppress-trace t)
+(put #'tramp-file-name-localname 'tramp-suppress-trace t)
+(put #'tramp-file-name-hop 'tramp-suppress-trace t)
+
 (defun tramp-file-name-user-domain (vec)
   "Return user and domain components of VEC."
   (when (or (tramp-file-name-user vec) (tramp-file-name-domain vec))
@@ -1396,6 +1407,8 @@ calling HANDLER.")
                 tramp-prefix-domain-format)
            (tramp-file-name-domain vec))))
 
+(put #'tramp-file-name-user-domain 'tramp-suppress-trace t)
+
 (defun tramp-file-name-host-port (vec)
   "Return host and port components of VEC."
   (when (or (tramp-file-name-host vec) (tramp-file-name-port vec))
@@ -1404,12 +1417,16 @@ calling HANDLER.")
                 tramp-prefix-port-format)
            (tramp-file-name-port vec))))
 
+(put #'tramp-file-name-host-port 'tramp-suppress-trace t)
+
 (defun tramp-file-name-port-or-default (vec)
   "Return port component of VEC.
 If nil, return `tramp-default-port'."
   (or (tramp-file-name-port vec)
       (tramp-get-method-parameter vec 'tramp-default-port)))
 
+(put #'tramp-file-name-port-or-default 'tramp-suppress-trace t)
+
 ;; Comparison of file names is performed by `tramp-equal-remote'.
 (defun tramp-file-name-equal-p (vec1 vec2)
   "Check, whether VEC1 and VEC2 denote the same `tramp-file-name'."
@@ -1456,6 +1473,8 @@ entry does not exist, return nil."
        (string-match-p tramp-file-name-regexp name)
        t))
 
+(put #'tramp-tramp-file-p 'tramp-suppress-trace t)
+
 ;; This function bypasses the file name handler approach.  It is NOT
 ;; recommended to use it in any package if not absolutely necessary.
 ;; However, it is more performant than `file-local-name', and might be
@@ -1504,6 +1523,8 @@ This is METHOD, if non-nil.  Otherwise, do a lookup in
        result
       (propertize result 'tramp-default t))))
 
+(put #'tramp-find-method 'tramp-suppress-trace t)
+
 (defun tramp-find-user (method user host)
   "Return the right user string to use depending on METHOD and HOST.
 This is USER, if non-nil.  Otherwise, do a lookup in
@@ -1525,6 +1546,8 @@ This is USER, if non-nil.  Otherwise, do a lookup in
        result
       (propertize result 'tramp-default t))))
 
+(put #'tramp-find-user 'tramp-suppress-trace t)
+
 (defun tramp-find-host (method user host)
   "Return the right host string to use depending on METHOD and USER.
 This is HOST, if non-nil.  Otherwise, do a lookup in
@@ -1546,6 +1569,8 @@ This is HOST, if non-nil.  Otherwise, do a lookup in
        result
       (propertize result 'tramp-default t))))
 
+(put #'tramp-find-host 'tramp-suppress-trace t)
+
 (defun tramp-dissect-file-name (name &optional nodefault)
   "Return a `tramp-file-name' structure of NAME, a remote file name.
 The structure consists of method, user, domain, host, port,
@@ -1610,6 +1635,8 @@ default values are used."
            (tramp-user-error
             v "Method `%s' is not supported for multi-hops." method)))))))
 
+(put #'tramp-dissect-file-name 'tramp-suppress-trace t)
+
 (defun tramp-dissect-hop-name (name &optional nodefault)
   "Return a `tramp-file-name' structure of `hop' part of NAME.
 See `tramp-dissect-file-name' for details."
@@ -1627,6 +1654,8 @@ See `tramp-dissect-file-name' for details."
     ;; Return result.
     v))
 
+(put #'tramp-dissect-hop-name 'tramp-suppress-trace t)
+
 (defun tramp-buffer-name (vec)
   "A name for the connection buffer VEC."
   (let ((method (tramp-file-name-method vec))
@@ -1636,6 +1665,8 @@ See `tramp-dissect-file-name' for details."
        (format "*tramp/%s %s@%s*" method user-domain host-port)
       (format "*tramp/%s %s*" method host-port))))
 
+(put #'tramp-buffer-name 'tramp-suppress-trace t)
+
 (defun tramp-make-tramp-file-name (&rest args)
   "Construct a Tramp file name from ARGS.
 
@@ -1803,6 +1834,8 @@ version, the function does nothing."
        (format "*debug tramp/%s %s@%s*" method user-domain host-port)
       (format "*debug tramp/%s %s*" method host-port))))
 
+(put #'tramp-debug-buffer-name 'tramp-suppress-trace t)
+
 (defconst tramp-debug-outline-regexp
   (concat
    "[[:digit:]]+:[[:digit:]]+:[[:digit:]]+\\.[[:digit:]]+ " ;; Timestamp.
@@ -1828,6 +1861,8 @@ Point must be at the beginning of a header line.
 The outline level is equal to the verbosity of the Tramp message."
   (1+ (string-to-number (match-string 2))))
 
+(put #'tramp-debug-outline-level 'tramp-suppress-trace t)
+
 (defun tramp-get-debug-buffer (vec)
   "Get the debug buffer for VEC."
   (with-current-buffer (get-buffer-create (tramp-debug-buffer-name vec))
@@ -1853,12 +1888,25 @@ The outline level is equal to the verbosity of the 
Tramp message."
       (use-local-map special-mode-map))
     (current-buffer)))
 
+(put #'tramp-get-debug-buffer 'tramp-suppress-trace t)
+
 (defun tramp-get-debug-file-name (vec)
-  "Get the debug buffer for VEC."
+  "Get the debug file name for VEC."
   (expand-file-name
    (tramp-compat-string-replace "/" " " (tramp-debug-buffer-name vec))
    (tramp-compat-temporary-file-directory)))
 
+(put #'tramp-get-debug-file-name 'tramp-suppress-trace t)
+
+(defun tramp-trace-buffer-name (vec)
+  "A name for the trace buffer for VEC."
+  (tramp-compat-string-replace "debug" "trace" (tramp-debug-buffer-name vec)))
+
+(put #'tramp-trace-buffer-name 'tramp-suppress-trace t)
+
+(defvar tramp-trace-functions nil
+  "A list of non-Tramp functions to be trace with tramp-verbose > 10.")
+
 (defun tramp-debug-message (vec fmt-string &rest arguments)
   "Append message to debug buffer of VEC.
 Message is formatted with FMT-STRING as control string and the remaining
@@ -1869,8 +1917,8 @@ ARGUMENTS to actually emit the message (if applicable)."
     (with-current-buffer (tramp-get-debug-buffer vec)
       (goto-char (point-max))
       (let ((point (point)))
-       ;; Headline.
        (when (bobp)
+         ;; Headline.
          (insert
           (format
            ";; Emacs: %s Tramp: %s -*- mode: outline; coding: utf-8; -*-"
@@ -1883,6 +1931,15 @@ ARGUMENTS to actually emit the message (if applicable)."
                (locate-library "tramp")
                (or tramp-repository-branch "")
                (or tramp-repository-version "")))))
+         ;; Traces.
+         (when (>= tramp-verbose 11)
+           (dolist
+               (elt
+                (append
+                 (mapcar #'intern (all-completions "tramp-" obarray 
'functionp))
+                 tramp-trace-functions))
+             (unless (get elt 'tramp-suppress-trace)
+               (trace-function-background elt))))
          ;; Delete debug file.
          (when (and tramp-debug-to-file (tramp-get-debug-file-name vec))
            (ignore-errors (delete-file (tramp-get-debug-file-name vec)))))
@@ -1991,7 +2048,7 @@ function is meant for debugging purposes."
 
 (put #'tramp-backtrace 'tramp-suppress-trace t)
 
-(defsubst tramp-error (vec-or-proc signal fmt-string &rest arguments)
+(defun tramp-error (vec-or-proc signal fmt-string &rest arguments)
   "Emit an error.
 VEC-OR-PROC identifies the connection to use, SIGNAL is the
 signal identifier to be raised, remaining arguments passed to
@@ -2574,6 +2631,8 @@ Falls back to normal file name handler if no Tramp file 
name handler exists."
     ;; might be an older, incompatible version active.  We try to
     ;; overload this.
     (let ((default-directory temporary-file-directory))
+      (when (bound-and-true-p tramp-archive-autoload)
+       (load "tramp-archive" 'noerror 'nomessage))
       (load "tramp" 'noerror 'nomessage)))
   (apply operation args)))
 
@@ -2585,7 +2644,7 @@ Falls back to normal file name handler if no Tramp file 
name handler exists."
   "Add Tramp file name handlers to `file-name-handler-alist' during autoload."
   (add-to-list 'file-name-handler-alist
               (cons tramp-autoload-file-name-regexp
-                    'tramp-autoload-file-name-handler))
+                    #'tramp-autoload-file-name-handler))
   (put #'tramp-autoload-file-name-handler 'safe-magic t)))
 
 ;;;###autoload (tramp-register-autoload-file-name-handlers)
@@ -2797,7 +2856,7 @@ not in completion mode."
      result1
      (ignore-errors
        (tramp-run-real-handler
-       'file-name-all-completions (list filename directory))))))
+       #'file-name-all-completions (list filename directory))))))
 
 ;; Method, host name and user name completion for a file.
 (defun tramp-completion-handle-file-name-completion
@@ -3218,7 +3277,7 @@ User is always nil."
     (tramp-compat-file-missing (tramp-dissect-file-name directory) directory))
   ;; We must do it file-wise.
   (tramp-run-real-handler
-   'copy-directory
+   #'copy-directory
    (list directory newname keep-date parents copy-contents)))
 
 (defun tramp-handle-directory-file-name (directory)
@@ -3568,6 +3627,11 @@ User is always nil."
        (and (file-directory-p (file-name-directory filename))
             (file-writable-p (file-name-directory filename)))))))
 
+(defcustom tramp-allow-unsafe-temporary-files nil
+  "Whether root-owned auto-save or backup files can be written to \"/tmp\"."
+  :version "28.1"
+  :type 'boolean)
+
 (defun tramp-handle-find-backup-file-name (filename)
   "Like `find-backup-file-name' for Tramp files."
   (with-parsed-tramp-file-name filename nil
@@ -3583,8 +3647,25 @@ User is always nil."
                       (tramp-make-tramp-file-name v (cdr x))
                     (cdr x))))
                tramp-backup-directory-alist)
-            backup-directory-alist)))
-      (tramp-run-real-handler #'find-backup-file-name (list filename)))))
+            backup-directory-alist))
+         result)
+      (prog1 ;; Run plain `find-backup-file-name'.
+         (setq result
+               (tramp-run-real-handler
+                #'find-backup-file-name (list filename)))
+        ;; Protect against security hole.
+       (when (and (not tramp-allow-unsafe-temporary-files)
+                  (file-in-directory-p (car result) temporary-file-directory)
+                  (zerop (or (tramp-compat-file-attribute-user-id
+                              (file-attributes filename 'integer))
+                             tramp-unknown-id-integer))
+                  (not (with-tramp-connection-property
+                           (tramp-get-process v) "unsafe-temporary-file"
+                         (yes-or-no-p
+                          (concat
+                           "Backup file on local temporary directory, "
+                           "do you want to continue? ")))))
+         (tramp-error v 'file-error "Unsafe backup file name"))))))
 
 (defun tramp-handle-insert-directory
   (filename switches &optional wildcard full-directory-p)
@@ -4305,8 +4386,7 @@ of."
       ;; We say `no-message' here because we don't want the visited file
       ;; modtime data to be clobbered from the temp file.  We call
       ;; `set-visited-file-modtime' ourselves later on.
-      (tramp-run-real-handler
-       #'write-region (list start end tmpfile append 'no-message lockname))
+      (write-region start end tmpfile append 'no-message lockname)
       (condition-case nil
          (rename-file tmpfile filename 'ok-if-already-exists)
        (error
@@ -5166,37 +5246,53 @@ Return the local name of the temporary file."
   "Like `make-auto-save-file-name' for Tramp files.
 Returns a file name in `tramp-auto-save-directory' for autosaving
 this file, if that variable is non-nil."
-  (when (stringp tramp-auto-save-directory)
-    (setq tramp-auto-save-directory
-         (expand-file-name tramp-auto-save-directory)))
-  ;; Create directory.
-  (unless (or (null tramp-auto-save-directory)
-             (file-exists-p tramp-auto-save-directory))
-    (make-directory tramp-auto-save-directory t))
-
-  (let ((system-type
-        (if (and (stringp tramp-auto-save-directory)
-                 (tramp-tramp-file-p tramp-auto-save-directory))
-            'not-windows
-          system-type))
-       (auto-save-file-name-transforms
-        (if (null tramp-auto-save-directory)
-            auto-save-file-name-transforms))
-       (buffer-file-name
-        (if (null tramp-auto-save-directory)
-            buffer-file-name
-          (expand-file-name
-           (tramp-subst-strs-in-string
-            '(("_" . "|")
-              ("/" . "_a")
-              (":" . "_b")
-              ("|" . "__")
-              ("[" . "_l")
-              ("]" . "_r"))
-            (tramp-compat-file-name-unquote (buffer-file-name)))
-           tramp-auto-save-directory))))
-    ;; Run plain `make-auto-save-file-name'.
-    (tramp-run-real-handler #'make-auto-save-file-name nil)))
+  (with-parsed-tramp-file-name buffer-file-name nil
+    (when (stringp tramp-auto-save-directory)
+      (setq tramp-auto-save-directory
+           (expand-file-name tramp-auto-save-directory)))
+    ;; Create directory.
+    (unless (or (null tramp-auto-save-directory)
+               (file-exists-p tramp-auto-save-directory))
+      (make-directory tramp-auto-save-directory t))
+
+    (let ((system-type
+          (if (and (stringp tramp-auto-save-directory)
+                   (tramp-tramp-file-p tramp-auto-save-directory))
+              'not-windows
+            system-type))
+         (auto-save-file-name-transforms
+          (if (null tramp-auto-save-directory)
+              auto-save-file-name-transforms))
+         (filename buffer-file-name)
+         (buffer-file-name
+          (if (null tramp-auto-save-directory)
+              buffer-file-name
+            (expand-file-name
+             (tramp-subst-strs-in-string
+              '(("_" . "|")
+                ("/" . "_a")
+                (":" . "_b")
+                ("|" . "__")
+                ("[" . "_l")
+                ("]" . "_r"))
+              (tramp-compat-file-name-unquote (buffer-file-name)))
+             tramp-auto-save-directory)))
+         result)
+      (prog1 ;; Run plain `make-auto-save-file-name'.
+         (setq result (tramp-run-real-handler #'make-auto-save-file-name nil))
+       ;; Protect against security hole.
+       (when (and (not tramp-allow-unsafe-temporary-files)
+                  (file-in-directory-p result temporary-file-directory)
+                  (zerop (or (tramp-compat-file-attribute-user-id
+                              (file-attributes filename 'integer))
+                             tramp-unknown-id-integer))
+                  (not (with-tramp-connection-property
+                           (tramp-get-process v) "unsafe-temporary-file"
+                         (yes-or-no-p
+                          (concat
+                           "Autosave file on local temporary directory, "
+                           "do you want to continue? ")))))
+         (tramp-error v 'file-error "Unsafe autosave file name"))))))
 
 (defun tramp-subst-strs-in-string (alist string)
   "Replace all occurrences of the string FROM with TO in STRING.
@@ -5406,6 +5502,8 @@ Invokes `password-read' if available, `read-passwd' else."
       ;; Reenable the timers.
       (with-timeout-unsuspend stimers))))
 
+(put #'tramp-read-passwd 'tramp-suppress-trace t)
+
 (defun tramp-clear-passwd (vec)
   "Clear password cache for connection related to VEC."
   (let ((method (tramp-file-name-method vec))
@@ -5420,6 +5518,8 @@ Invokes `password-read' if available, `read-passwd' else."
        :host ,host-port :port ,method))
     (password-cache-remove (tramp-make-tramp-file-name vec 'noloc 'nohop))))
 
+(put #'tramp-clear-passwd 'tramp-suppress-trace t)
+
 (defun tramp-time-diff (t1 t2)
   "Return the difference between the two times, in seconds.
 T1 and T2 are time values (as returned by `current-time' for example)."
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index abd9221..e6cf4c6 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -7,7 +7,7 @@
 ;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
 ;; Keywords: comm, processes
 ;; Package: tramp
-;; Version: 2.5.1-pre
+;; Version: 2.5.1
 ;; Package-Requires: ((emacs "25.1"))
 ;; Package-Type: multi
 ;; URL: https://www.gnu.org/software/tramp/
@@ -40,7 +40,7 @@
 ;; ./configure" to change them.
 
 ;;;###tramp-autoload
-(defconst tramp-version "2.5.1-pre"
+(defconst tramp-version "2.5.1"
   "This version of Tramp.")
 
 ;;;###tramp-autoload
@@ -76,7 +76,7 @@
 ;; Check for Emacs version.
 (let ((x   (if (not (string-lessp emacs-version "25.1"))
       "ok"
-    (format "Tramp 2.5.1-pre is not fit for %s"
+    (format "Tramp 2.5.1 is not fit for %s"
             (replace-regexp-in-string "\n" "" (emacs-version))))))
   (unless (string-equal "ok" x) (error "%s" x)))
 
diff --git a/lisp/nxml/rng-nxml.el b/lisp/nxml/rng-nxml.el
index 33768a4..d70a346 100644
--- a/lisp/nxml/rng-nxml.el
+++ b/lisp/nxml/rng-nxml.el
@@ -179,7 +179,8 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' 
is non-nil."
                    ;; attributes are required
                    (insert " "))))
               ((member completion extra-strings)
-               (insert ">")))))))))
+               (insert ">"))))
+          :company-kind ,(lambda () 'property))))))
 
 (defconst rng-in-end-tag-name-regex
   (replace-regexp-in-string
@@ -254,7 +255,8 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' 
is non-nil."
                   (when (and (eq status 'finished)
                              (not (looking-at "=")))
                     (insert "=\"\"")
-                    (forward-char -1)))))))))
+                    (forward-char -1)))
+               :company-kind ,(lambda (_) 'enum-member)))))))
 
 (defconst rng-in-attribute-value-regex
   (replace-regexp-in-string
@@ -279,7 +281,8 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' 
is non-nil."
             (lambda (_completion status)
               (when (eq status 'finished)
                 (let ((delim (char-before value-start)))
-                  (unless (eq (char-after) delim) (insert delim)))))))
+                  (unless (eq (char-after) delim) (insert delim))))))
+           (kind-function (lambda (_) 'value)))
       (and (rng-adjust-state-for-attribute lt-pos
                                           name-start)
           (if (string= (buffer-substring-no-properties name-start
@@ -290,14 +293,16 @@ Validation will be enabled if 
`rng-nxml-auto-validate-flag' is non-nil."
                    (rng-possible-namespace-uris
                     (and colon
                          (buffer-substring-no-properties (1+ colon) 
name-end))))
-                 :exit-function ,exit-function)
+                 :exit-function ,exit-function
+                 :company-kind ,kind-function)
             (rng-adjust-state-for-attribute-value name-start
                                                   colon
                                                   name-end)
              `(,value-start ,(point)
                ,(rng-strings-to-completion-table
                  (rng-match-possible-value-strings))
-               :exit-function ,exit-function))))))
+               :exit-function ,exit-function
+               :company-kind ,kind-function))))))
 
 (defun rng-possible-namespace-uris (prefix)
   (let ((ns (if prefix (nxml-ns-get-prefix prefix)
diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el
index 251ad97..1283970 100644
--- a/lisp/org/org-clock.el
+++ b/lisp/org/org-clock.el
@@ -539,8 +539,8 @@ of a different task.")
   "Marker pointing to the task that has been interrupted by the current 
clock.")
 
 (defvar org-clock-mode-line-map (make-sparse-keymap))
-(define-key org-clock-mode-line-map [mode-line mouse-2] 'org-clock-goto)
-(define-key org-clock-mode-line-map [mode-line mouse-1] 'org-clock-menu)
+(define-key org-clock-mode-line-map [mode-line mouse-2] #'org-clock-goto)
+(define-key org-clock-mode-line-map [mode-line mouse-1] #'org-clock-menu)
 
 (defun org-clock--translate (s language)
   "Translate string S into using string LANGUAGE.
@@ -1414,12 +1414,12 @@ the default behavior."
           (setq org-clock-mode-line-timer
                 (run-with-timer org-clock-update-period
                                 org-clock-update-period
-                                'org-clock-update-mode-line)))
+                                #'org-clock-update-mode-line)))
         (when org-clock-idle-timer
           (cancel-timer org-clock-idle-timer)
           (setq org-clock-idle-timer nil))
         (setq org-clock-idle-timer
-              (run-with-timer 60 60 'org-resolve-clocks-if-idle))
+              (run-with-timer 60 60 #'org-resolve-clocks-if-idle))
         (message "Clock starts at %s - %s" ts org--msg-extra)
         (run-hooks 'org-clock-in-hook))))))
 
@@ -1716,7 +1716,7 @@ to, overriding the existing value of 
`org-clock-out-switch-to-state'."
          (unless (org-clocking-p)
            (setq org-clock-current-task nil)))))))
 
-(add-hook 'org-clock-out-hook 'org-clock-remove-empty-clock-drawer)
+(add-hook 'org-clock-out-hook #'org-clock-remove-empty-clock-drawer)
 
 (defun org-clock-remove-empty-clock-drawer ()
   "Remove empty clock drawers in current subtree."
@@ -2012,7 +2012,7 @@ Use `\\[org-clock-remove-overlays]' to remove the subtree 
times."
              (when time (org-clock-put-overlay time)))))
        ;; Arrange to remove the overlays upon next change.
        (when org-remove-highlights-with-change
-         (add-hook 'before-change-functions 'org-clock-remove-overlays
+         (add-hook 'before-change-functions #'org-clock-remove-overlays
                    nil 'local))))
     (let* ((h (/ org-clock-file-total-minutes 60))
           (m (- org-clock-file-total-minutes (* 60 h))))
@@ -2063,7 +2063,7 @@ If NOREMOVE is nil, remove this function from the
     (setq org-clock-overlays nil)
     (unless noremove
       (remove-hook 'before-change-functions
-                  'org-clock-remove-overlays 'local))))
+                  #'org-clock-remove-overlays 'local))))
 
 ;;;###autoload
 (defun org-clock-out-if-current ()
@@ -2932,12 +2932,12 @@ PROPERTIES: The list properties specified in the 
`:properties' parameter
     (save-excursion
       (org-clock-sum ts te
                     (when matcher
-                      `(lambda ()
-                         (let* ((todo (org-get-todo-state))
-                                (tags-list (org-get-tags))
-                                (org-scanner-tags tags-list)
-                                (org-trust-scanner-tags t))
-                           (funcall ,matcher todo tags-list nil)))))
+                      (lambda ()
+                        (let* ((todo (org-get-todo-state))
+                               (tags-list (org-get-tags))
+                               (org-scanner-tags tags-list)
+                               (org-trust-scanner-tags t))
+                          (funcall matcher todo tags-list nil)))))
       (goto-char (point-min))
       (setq st t)
       (while (or (and (bobp) (prog1 st (setq st nil))
diff --git a/lisp/org/org-colview.el b/lisp/org/org-colview.el
index 75056d45..2f03906 100644
--- a/lisp/org/org-colview.el
+++ b/lisp/org/org-colview.el
@@ -162,20 +162,20 @@ See `org-columns-summary-types' for details.")
   (org-overview)
   (org-content))
 
-(org-defkey org-columns-map "c" 'org-columns-content)
-(org-defkey org-columns-map "o" 'org-overview)
-(org-defkey org-columns-map "e" 'org-columns-edit-value)
-(org-defkey org-columns-map "\C-c\C-t" 'org-columns-todo)
-(org-defkey org-columns-map "\C-c\C-c" 'org-columns-toggle-or-columns-quit)
-(org-defkey org-columns-map "\C-c\C-o" 'org-columns-open-link)
-(org-defkey org-columns-map "v" 'org-columns-show-value)
-(org-defkey org-columns-map "q" 'org-columns-quit)
-(org-defkey org-columns-map "r" 'org-columns-redo)
-(org-defkey org-columns-map "g" 'org-columns-redo)
-(org-defkey org-columns-map [left] 'backward-char)
-(org-defkey org-columns-map "\M-b" 'backward-char)
-(org-defkey org-columns-map "a" 'org-columns-edit-allowed)
-(org-defkey org-columns-map "s" 'org-columns-edit-attributes)
+(org-defkey org-columns-map "c"        #'org-columns-content)
+(org-defkey org-columns-map "o"        #'org-overview)
+(org-defkey org-columns-map "e"        #'org-columns-edit-value)
+(org-defkey org-columns-map "\C-c\C-t" #'org-columns-todo)
+(org-defkey org-columns-map "\C-c\C-c" #'org-columns-toggle-or-columns-quit)
+(org-defkey org-columns-map "\C-c\C-o" #'org-columns-open-link)
+(org-defkey org-columns-map "v"        #'org-columns-show-value)
+(org-defkey org-columns-map "q"        #'org-columns-quit)
+(org-defkey org-columns-map "r"        #'org-columns-redo)
+(org-defkey org-columns-map "g"        #'org-columns-redo)
+(org-defkey org-columns-map [left]     #'backward-char)
+(org-defkey org-columns-map "\M-b"     #'backward-char)
+(org-defkey org-columns-map "a"        #'org-columns-edit-allowed)
+(org-defkey org-columns-map "s"        #'org-columns-edit-attributes)
 (org-defkey org-columns-map "\M-f"
            (lambda () (interactive) (goto-char (1+ (point)))))
 (org-defkey org-columns-map [right]
@@ -187,7 +187,7 @@ See `org-columns-summary-types' for details.")
                (while (and (org-invisible-p2) (not (eobp)))
                  (beginning-of-line 2))
                (move-to-column col)
-               (if (eq major-mode 'org-agenda-mode)
+               (if (derived-mode-p 'org-agenda-mode)
                    (org-agenda-do-context-action)))))
 (org-defkey org-columns-map [up]
            (lambda () (interactive)
@@ -198,20 +198,20 @@ See `org-columns-summary-types' for details.")
                (move-to-column col)
                (if (eq major-mode 'org-agenda-mode)
                    (org-agenda-do-context-action)))))
-(org-defkey org-columns-map [(shift right)] 'org-columns-next-allowed-value)
-(org-defkey org-columns-map "n" 'org-columns-next-allowed-value)
-(org-defkey org-columns-map [(shift left)] 'org-columns-previous-allowed-value)
-(org-defkey org-columns-map "p" 'org-columns-previous-allowed-value)
-(org-defkey org-columns-map "<" 'org-columns-narrow)
-(org-defkey org-columns-map ">" 'org-columns-widen)
-(org-defkey org-columns-map [(meta right)] 'org-columns-move-right)
-(org-defkey org-columns-map [(meta left)] 'org-columns-move-left)
-(org-defkey org-columns-map [(shift meta right)] 'org-columns-new)
-(org-defkey org-columns-map [(shift meta left)] 'org-columns-delete)
+(org-defkey org-columns-map [(shift right)] #'org-columns-next-allowed-value)
+(org-defkey org-columns-map "n" #'org-columns-next-allowed-value)
+(org-defkey org-columns-map [(shift left)] 
#'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "p" #'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "<" #'org-columns-narrow)
+(org-defkey org-columns-map ">" #'org-columns-widen)
+(org-defkey org-columns-map [(meta right)] #'org-columns-move-right)
+(org-defkey org-columns-map [(meta left)]  #'org-columns-move-left)
+(org-defkey org-columns-map [(shift meta right)] #'org-columns-new)
+(org-defkey org-columns-map [(shift meta left)]  #'org-columns-delete)
 (dotimes (i 10)
   (org-defkey org-columns-map (number-to-string i)
-             `(lambda () (interactive)
-                (org-columns-next-allowed-value nil ,i))))
+             (lambda () (interactive)
+               (org-columns-next-allowed-value nil i))))
 
 (easy-menu-define org-columns-menu org-columns-map "Org Column Menu"
   '("Column"
@@ -490,7 +490,7 @@ for the duration of the command.")
           (org-add-props " " nil 'display `(space :align-to ,linum-offset))
           (org-add-props (substring title 0 -1) nil 'face 'org-column-title)))
     (setq org-columns-previous-hscroll -1)
-    (add-hook 'post-command-hook 'org-columns-hscroll-title nil 'local)))
+    (add-hook 'post-command-hook #'org-columns-hscroll-title nil 'local)))
 
 (defun org-columns-hscroll-title ()
   "Set the `header-line-format' so that it scrolls along with the table."
@@ -519,7 +519,7 @@ for the duration of the command.")
     (when (local-variable-p 'org-previous-header-line-format)
       (setq header-line-format org-previous-header-line-format)
       (kill-local-variable 'org-previous-header-line-format)
-      (remove-hook 'post-command-hook 'org-columns-hscroll-title 'local))
+      (remove-hook 'post-command-hook #'org-columns-hscroll-title 'local))
     (set-marker org-columns-begin-marker nil)
     (when (markerp org-columns-top-level-marker)
       (set-marker org-columns-top-level-marker nil))
@@ -782,7 +782,7 @@ around it."
       (setq time-after (copy-sequence time))
       (setf (nth 3 time-before) (1- (nth 3 time)))
       (setf (nth 3 time-after) (1+ (nth 3 time)))
-      (mapcar (lambda (x) (format-time-string fmt (apply 'encode-time x)))
+      (mapcar (lambda (x) (format-time-string fmt (apply #'encode-time x)))
              (list time-before time time-after)))))
 
 (defun org-columns-open-link (&optional arg)
diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el
index 1f4e2e8..b68e5b5 100644
--- a/lisp/org/org-compat.el
+++ b/lisp/org/org-compat.el
@@ -1151,8 +1151,8 @@ key."
     ((guard (not (lookup-key calendar-mode-map "c")))
      (local-set-key "c" #'org-calendar-goto-agenda))
     (_ nil))
-  (unless (and (boundp 'org-agenda-diary-file)
-              (eq org-agenda-diary-file 'diary-file))
+  (when (and (boundp 'org-agenda-diary-file)
+            (not (eq org-agenda-diary-file 'diary-file)))
     (local-set-key org-calendar-insert-diary-entry-key
                   #'org-agenda-diary-entry)))
 
diff --git a/lisp/org/org-mouse.el b/lisp/org/org-mouse.el
index 5c222ea..57281dd 100644
--- a/lisp/org/org-mouse.el
+++ b/lisp/org/org-mouse.el
@@ -167,14 +167,12 @@ indirectly, for example, through the agenda buffer.")
 
 (defcustom org-mouse-punctuation ":"
   "Punctuation used when inserting text by drag and drop."
-  :group 'org-mouse
   :type 'string)
 
 (defcustom org-mouse-features
   '(context-menu yank-link activate-stars activate-bullets activate-checkboxes)
   "The features of org-mouse that should be activated.
 Changing this variable requires a restart of Emacs to get activated."
-  :group 'org-mouse
   :type '(set :greedy t
              (const :tag "Mouse-3 shows context menu" context-menu)
              (const :tag "C-mouse-1 and mouse-3 move trees" move-tree)
@@ -292,19 +290,19 @@ argument.  If it is a string, it is interpreted as the 
format
 string to (format ITEMFORMAT keyword).  If it is neither a string
 nor a function, elements of KEYWORDS are used directly."
   (mapcar
-   `(lambda (keyword)
+   (lambda (keyword)
       (vector (cond
-              ((functionp ,itemformat) (funcall ,itemformat keyword))
-              ((stringp ,itemformat) (format ,itemformat keyword))
+              ((functionp itemformat) (funcall itemformat keyword))
+              ((stringp itemformat) (format itemformat keyword))
               (t keyword))
-             (list 'funcall ,function keyword)
+             (list 'funcall function keyword)
              :style (cond
-                     ((null ,selected) t)
-                     ((functionp ,selected) 'toggle)
+                     ((null selected) t)
+                     ((functionp selected) 'toggle)
                      (t 'radio))
-             :selected (if (functionp ,selected)
-                           (and (funcall ,selected keyword) t)
-                         (equal ,selected keyword))))
+             :selected (if (functionp selected)
+                           (and (funcall selected keyword) t)
+                         (equal selected keyword))))
    keywords))
 
 (defun org-mouse-remove-match-and-spaces ()
@@ -344,12 +342,12 @@ string to (format ITEMFORMAT keyword).  If it is neither 
a string
 nor a function, elements of KEYWORDS are used directly."
   (setq group (or group 0))
   (let ((replace (org-mouse-match-closure
-                 (if nosurround 'replace-match
-                   'org-mouse-replace-match-and-surround))))
+                 (if nosurround #'replace-match
+                   #'org-mouse-replace-match-and-surround))))
     (append
      (org-mouse-keyword-menu
       keywords
-      `(lambda (keyword) (funcall ,replace keyword t t nil ,group))
+      (lambda (keyword) (funcall replace keyword t t nil group))
       (match-string group)
       itemformat)
      `(["None" org-mouse-remove-match-and-spaces
@@ -416,7 +414,7 @@ SCHEDULED: or DEADLINE: or ANYTHINGLIKETHIS:"
    (let ((kwds org-todo-keywords-1))
      (org-mouse-keyword-menu
       kwds
-      `(lambda (kwd) (org-todo kwd))
+      #'org-todo
       (lambda (kwd) (equal state kwd))))))
 
 (defun org-mouse-tag-menu ()           ;todo
@@ -424,14 +422,14 @@ SCHEDULED: or DEADLINE: or ANYTHINGLIKETHIS:"
   (append
    (let ((tags (org-get-tags nil t)))
      (org-mouse-keyword-menu
-      (sort (mapcar 'car (org-get-buffer-tags)) 'string-lessp)
-      `(lambda (tag)
+      (sort (mapcar #'car (org-get-buffer-tags)) #'string-lessp)
+      (lambda (tag)
         (org-mouse-set-tags
-         (sort (if (member tag (quote ,tags))
-                   (delete tag (quote ,tags))
-                 (cons tag (quote ,tags)))
-               'string-lessp)))
-      `(lambda (tag) (member tag (quote ,tags)))
+         (sort (if (member tag tags)
+                   (delete tag tags)
+                 (cons tag tags))
+               #'string-lessp)))
+      (lambda (tag) (member tag tags))
       ))
    '("--"
      ["Align Tags Here" (org-align-tags) t]
@@ -500,7 +498,7 @@ SCHEDULED: or DEADLINE: or ANYTHINGLIKETHIS:"
      ["Check TODOs" org-show-todo-tree t]
      ("Check Tags"
       ,@(org-mouse-keyword-menu
-        (sort (mapcar 'car (org-get-buffer-tags)) 'string-lessp)
+        (sort (mapcar #'car (org-get-buffer-tags)) #'string-lessp)
         #'(lambda (tag) (org-tags-sparse-tree nil tag)))
       "--"
       ["Custom Tag ..." org-tags-sparse-tree t])
@@ -510,16 +508,16 @@ SCHEDULED: or DEADLINE: or ANYTHINGLIKETHIS:"
      ["Display TODO List" org-todo-list t]
      ("Display Tags"
       ,@(org-mouse-keyword-menu
-        (sort (mapcar 'car (org-get-buffer-tags)) 'string-lessp)
+        (sort (mapcar #'car (org-get-buffer-tags)) #'string-lessp)
         #'(lambda (tag) (org-tags-view nil tag)))
       "--"
       ["Custom Tag ..." org-tags-view t])
      ["Display Calendar" org-goto-calendar t]
      "--"
      ,@(org-mouse-keyword-menu
-       (mapcar 'car org-agenda-custom-commands)
+       (mapcar #'car org-agenda-custom-commands)
        #'(lambda (key)
-           (eval `(org-agenda nil (string-to-char ,key))))
+           (org-agenda nil (string-to-char key)))
        nil
        #'(lambda (key)
            (let ((entry (assoc key org-agenda-custom-commands)))
@@ -594,10 +592,10 @@ This means, between the beginning of line and the point."
 
 (defun org-mouse-match-closure (function)
   (let ((match (match-data t)))
-    `(lambda (&rest rest)
-       (save-match-data
-        (set-match-data ',match)
-        (apply ',function rest)))))
+    (lambda (&rest rest)
+      (save-match-data
+       (set-match-data match)
+       (apply function rest)))))
 
 (defun org-mouse-yank-link (click)
   (interactive "e")
@@ -631,7 +629,7 @@ This means, between the beginning of line and the point."
      ((save-excursion (beginning-of-line) (looking-at "[ \t]*#\\+STARTUP: 
\\(.*\\)"))
       (popup-menu
        `(nil
-        ,@(org-mouse-list-options-menu (mapcar 'car org-startup-options)
+        ,@(org-mouse-list-options-menu (mapcar #'car org-startup-options)
                                        'org-mode-restart))))
      ((or (eolp)
          (and (looking-at "\\(  \\|\t\\)\\(\\+:[0-9a-zA-Z_:]+\\)?\\(  
\\|\t\\)+$")
@@ -857,21 +855,21 @@ This means, between the beginning of line and the point."
 
 (add-hook 'org-mode-hook
          #'(lambda ()
-             (setq org-mouse-context-menu-function 'org-mouse-context-menu)
+             (setq org-mouse-context-menu-function #'org-mouse-context-menu)
 
              (when (memq 'context-menu org-mouse-features)
                (org-defkey org-mouse-map [mouse-3] nil)
-               (org-defkey org-mode-map [mouse-3] 
'org-mouse-show-context-menu))
-             (org-defkey org-mode-map [down-mouse-1] 'org-mouse-down-mouse)
+               (org-defkey org-mode-map [mouse-3] 
#'org-mouse-show-context-menu))
+             (org-defkey org-mode-map [down-mouse-1] #'org-mouse-down-mouse)
              (when (memq 'context-menu org-mouse-features)
-               (org-defkey org-mouse-map [C-drag-mouse-1] 'org-mouse-move-tree)
-               (org-defkey org-mouse-map [C-down-mouse-1] 
'org-mouse-move-tree-start))
+               (org-defkey org-mouse-map [C-drag-mouse-1] 
#'org-mouse-move-tree)
+               (org-defkey org-mouse-map [C-down-mouse-1] 
#'org-mouse-move-tree-start))
              (when (memq 'yank-link org-mouse-features)
-               (org-defkey org-mode-map [S-mouse-2] 'org-mouse-yank-link)
-               (org-defkey org-mode-map [drag-mouse-3] 'org-mouse-yank-link))
+               (org-defkey org-mode-map [S-mouse-2] #'org-mouse-yank-link)
+               (org-defkey org-mode-map [drag-mouse-3] #'org-mouse-yank-link))
              (when (memq 'move-tree org-mouse-features)
-               (org-defkey org-mouse-map [drag-mouse-3] 'org-mouse-move-tree)
-               (org-defkey org-mouse-map [down-mouse-3] 
'org-mouse-move-tree-start))
+               (org-defkey org-mouse-map [drag-mouse-3] #'org-mouse-move-tree)
+               (org-defkey org-mouse-map [down-mouse-3] 
#'org-mouse-move-tree-start))
 
              (when (memq 'activate-stars org-mouse-features)
                (font-lock-add-keywords
@@ -1086,11 +1084,11 @@ This means, between the beginning of line and the 
point."
 (defvar org-agenda-mode-map)
 (add-hook 'org-agenda-mode-hook
          (lambda ()
-           (setq org-mouse-context-menu-function 
'org-mouse-agenda-context-menu)
-           (org-defkey org-agenda-mode-map [mouse-3] 
'org-mouse-show-context-menu)
-           (org-defkey org-agenda-mode-map [down-mouse-3] 
'org-mouse-move-tree-start)
-           (org-defkey org-agenda-mode-map [C-mouse-4] 'org-agenda-earlier)
-           (org-defkey org-agenda-mode-map [C-mouse-5] 'org-agenda-later)
+           (setq org-mouse-context-menu-function 
#'org-mouse-agenda-context-menu)
+           (org-defkey org-agenda-mode-map [mouse-3] 
#'org-mouse-show-context-menu)
+           (org-defkey org-agenda-mode-map [down-mouse-3] 
#'org-mouse-move-tree-start)
+           (org-defkey org-agenda-mode-map [C-mouse-4] #'org-agenda-earlier)
+           (org-defkey org-agenda-mode-map [C-mouse-5] #'org-agenda-later)
            (org-defkey org-agenda-mode-map [drag-mouse-3]
                        (lambda (event) (interactive "e")
                          (cl-case (org-mouse-get-gesture event)
diff --git a/lisp/org/org-timer.el b/lisp/org/org-timer.el
index b6802fe..852d185 100644
--- a/lisp/org/org-timer.el
+++ b/lisp/org/org-timer.el
@@ -366,7 +366,7 @@ VALUE can be `on', `off', or `paused'."
        (setq org-timer-mode-line-timer nil))
      (when org-timer-display
        (setq org-timer-mode-line-timer
-            (run-with-timer 1 1 'org-timer-update-mode-line))))))
+            (run-with-timer 1 1 #'org-timer-update-mode-line))))))
 
 (defun org-timer-update-mode-line ()
   "Update the timer time in the mode line."
@@ -456,14 +456,15 @@ using three `C-u' prefix arguments."
   "Start countdown timer that will last SECS.
 TITLE will be appended to the notification message displayed when
 time is up."
-  (let ((msg (format "%s: time out" title)))
+  (let ((msg (format "%s: time out" title))
+        (sound org-clock-sound))
     (run-with-timer
-     secs nil `(lambda ()
-                (setq org-timer-countdown-timer nil
-                      org-timer-start-time nil)
-                (org-notify ,msg ,org-clock-sound)
-                (org-timer-set-mode-line 'off)
-                (run-hooks 'org-timer-done-hook)))))
+     secs nil (lambda ()
+               (setq org-timer-countdown-timer nil
+                     org-timer-start-time nil)
+               (org-notify msg sound)
+               (org-timer-set-mode-line 'off)
+               (run-hooks 'org-timer-done-hook)))))
 
 (defun org-timer--get-timer-title ()
   "Construct timer title.
diff --git a/lisp/outline.el b/lisp/outline.el
index fa7c1a2..68b8f4b 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -205,7 +205,9 @@ in the file it applies to.")
                                  (list 'face (outline-font-lock-face)
                                        'keymap outline-mode-cycle-map)
                                (list 'face nil
-                                     'keymap outline-mode-cycle-map)))
+                                     'keymap outline-mode-cycle-map))
+                           (if outline-minor-mode-highlight
+                               (list 'face (outline-font-lock-face))))
                        (outline-font-lock-face))
                   (when outline-minor-mode
                     (pcase outline-minor-mode-highlight
@@ -349,7 +351,7 @@ faces to major mode's faces."
                  (const :tag "Append outline faces to major mode faces" append)
                  (const :tag "Highlight separately from major mode faces" t))
   :version "28.1")
-;;;###autoload(put 'outline-minor-mode-highlight 'safe-local-variable 
'booleanp)
+;;;###autoload(put 'outline-minor-mode-highlight 'safe-local-variable 'symbolp)
 
 (defun outline-minor-mode-highlight-buffer ()
   ;; Fallback to overlays when font-lock is unsupported.
diff --git a/lisp/play/morse.el b/lisp/play/morse.el
index 91dc687..bfb25ba 100644
--- a/lisp/play/morse.el
+++ b/lisp/play/morse.el
@@ -79,17 +79,16 @@
                     ("8" . "---..")
                     ("9" . "----.")
                     ;; Non-ASCII
-                    ("Ä" . ".-.-")
-                    ("Æ" . ".-.-")
-                    ("Á" . ".--.-")
-                    ("Å" . ".--.-")
-                    ;; ligature character?? ("Ch" . "----")
-                    ("ß" . ".../...")
-                    ("É" . "..-..")
-                    ("Ñ" . "--.--")
-                    ("Ö" . "---.")
-                    ("Ø" . "---.")
-                    ("Ü" . "..--")
+                    ("ä" . ".-.-")
+                    ("æ" . ".-.-")
+                    ("á" . ".--.-")
+                    ("å" . ".--.-")
+                    ("ß" . ".../...")  ; also ...--..
+                    ("é" . "..-..")
+                    ("ñ" . "--.--")
+                    ("ö" . "---.")
+                    ("ø" . "---.")
+                    ("ü" . "..--")
                     ;; Recently standardized
                     ("@" . ".--.-."))
   "Morse code character set.")
@@ -165,7 +164,7 @@ Geospatial-Intelligence Agency at URL 
`https://www.nga.mil/'")
               (setq sep ""))
              ((setq morse (assoc str morse-code))
               (delete-char 1)
-              (insert sep (cdr morse))
+              (insert-before-markers sep (cdr morse))
               (setq sep "/"))
              (t
               (forward-char 1)
@@ -211,7 +210,7 @@ Geospatial-Intelligence Agency at URL 
`https://www.nga.mil/'")
               (setq sep ""))
              ((setq nato (assoc str nato-alphabet))
               (delete-char 1)
-              (insert sep (cdr nato))
+              (insert-before-markers sep (cdr nato))
               (setq sep "-"))
              (t
               (forward-char 1)
diff --git a/lisp/printing.el b/lisp/printing.el
index 5c7da96..e7aab90 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -1081,24 +1081,15 @@ Used by `pr-menu-bind' and `pr-update-menus'.")
   "Specify Printing menu-bar entry.")
 
 (defun pr-global-menubar (menu-spec)
-  (let ((menu-file '("menu-bar" "file")))
-    (cond
-     (pr-menu-print-item
-      (easy-menu-add-item global-map menu-file
-                          (easy-menu-create-menu "Print" menu-spec)
-                          "print-buffer")
-      (dolist (item '("print-buffer"          "print-region"
-                      "ps-print-buffer-faces" "ps-print-region-faces"
-                      "ps-print-buffer"       "ps-print-region"))
-        (easy-menu-remove-item global-map menu-file item))
-      (setq pr-menu-print-item nil
-            pr-menu-bar (vector 'menu-bar
-                                (easy-menu-intern (nth 1 menu-file))
-                                (easy-menu-intern "Print"))))
-     (t
-      (easy-menu-add-item global-map menu-file
-                          (easy-menu-create-menu "Print" menu-spec)))
-     )))
+  (let ((menu-file '("menu-bar" "file"))
+        (submenu-path [menu-bar file Print])
+        (submenu (easy-menu-create-menu "Print" menu-spec)))
+    (cond (pr-menu-print-item
+           (easy-menu-add-item global-map menu-file submenu "Print")
+           (easy-menu-remove-item global-map menu-file "print")
+           (setq pr-menu-print-item nil
+                 pr-menu-bar submenu-path))
+          (t (easy-menu-add-item global-map menu-file submenu)))))
 
 (defun pr-menu-position (entry index horizontal)
   (let ((pos (cdr (mouse-pixel-position))))
diff --git a/lisp/profiler.el b/lisp/profiler.el
index 64d71f4..8145e51 100644
--- a/lisp/profiler.el
+++ b/lisp/profiler.el
@@ -822,8 +822,12 @@ below entry at point."
 (defun profiler-start (mode)
   "Start/restart profilers.
 MODE can be one of `cpu', `mem', or `cpu+mem'.
-If MODE is `cpu' or `cpu+mem', time-based profiler will be started.
-Also, if MODE is `mem' or `cpu+mem', then memory profiler will be started."
+If MODE is `cpu' or `cpu+mem', start the time-based profiler,
+   whereby CPU is sampled periodically using the SIGPROF signal.
+If MODE is `mem' or `cpu+mem', start profiler that samples CPU
+   whenever memory-allocation functions are called -- this is useful
+   if SIGPROF is not supported, or is unreliable, or is not sampling
+   at a high enough frequency."
   (interactive
    (list (if (not (fboundp 'profiler-cpu-start)) 'mem
            (intern (completing-read (format-prompt "Mode" "cpu")
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index 0c5837c..f1ec522 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -138,7 +138,7 @@ The second subexpression should match the bug reference 
(usually a number)."
        (when url
          (browse-url url))))))
 
-(defun bug-reference--maybe-setup-from-vc (url url-rx bug-rx bug-url-fmt)
+(defun bug-reference-maybe-setup-from-vc (url url-rx bug-rx bug-url-fmt)
   (when (string-match url-rx url)
     (setq-local bug-reference-bug-regexp bug-rx)
     (setq-local bug-reference-url-format
@@ -224,7 +224,7 @@ and apply it if applicable."
         (when url
           (catch 'found
             (dolist (config bug-reference-setup-from-vc-alist)
-              (when (apply #'bug-reference--maybe-setup-from-vc
+              (when (apply #'bug-reference-maybe-setup-from-vc
                            url config)
                 (throw 'found t)))))))))
 
@@ -238,8 +238,8 @@ and apply it if applicable."
   "An alist for setting up `bug-reference-mode' in mail modes.
 
 This takes action if `bug-reference-mode' is enabled in group and
-message buffers of Emacs mail clients.  Currently, only Gnus is
-supported.
+message buffers of Emacs mail clients.  Currently, Gnus and Rmail
+are supported.
 
 Each element has the form
 
@@ -258,7 +258,7 @@ same `bug-reference-url-format' and 
`bug-reference-url-format'.")
 
 (defvar gnus-newsgroup-name)
 
-(defun bug-reference--maybe-setup-from-mail (group header-values)
+(defun bug-reference-maybe-setup-from-mail (group header-values)
   "Set up according to mail GROUP or HEADER-VALUES.
 Group is a mail group/folder name and HEADER-VALUES is a list of
 mail header values, e.g., the values of From, To, Cc, List-ID,
@@ -294,53 +294,70 @@ and set it if applicable."
     ;; article changes.
     (add-hook 'gnus-article-prepare-hook
               #'bug-reference--try-setup-gnus-article)
-    (bug-reference--maybe-setup-from-mail gnus-newsgroup-name nil)))
+    (bug-reference-maybe-setup-from-mail gnus-newsgroup-name nil)))
 
 (defvar gnus-article-buffer)
 (defvar gnus-original-article-buffer)
 (defvar gnus-summary-buffer)
 
 (defun bug-reference--try-setup-gnus-article ()
-  (with-demoted-errors
-      "Error in bug-reference--try-setup-gnus-article: %S"
-    (when (and bug-reference-mode ;; Only if enabled in article buffers.
-               (derived-mode-p
-                'gnus-article-mode
-                ;; Apparently, gnus-article-prepare-hook is run in the
-                ;; summary buffer...
-                'gnus-summary-mode)
-               gnus-article-buffer
-               gnus-original-article-buffer
-               (buffer-live-p (get-buffer gnus-article-buffer))
-               (buffer-live-p (get-buffer gnus-original-article-buffer)))
-      (with-current-buffer gnus-article-buffer
-        (catch 'setup-done
-          ;; Copy over the values from the summary buffer.
-          (when (and gnus-summary-buffer
-                     (buffer-live-p gnus-summary-buffer))
-            (setq-local bug-reference-bug-regexp
-                        (with-current-buffer gnus-summary-buffer
-                          bug-reference-bug-regexp))
-            (setq-local bug-reference-url-format
-                        (with-current-buffer gnus-summary-buffer
-                          bug-reference-url-format))
-            (when (and bug-reference-bug-regexp
-                       bug-reference-url-format)
-              (throw 'setup-done t)))
-          ;; If the summary had no values, try setting according to
-          ;; the values of the From, To, and Cc headers.
-          (let (header-values)
-            (with-current-buffer
-                (get-buffer gnus-original-article-buffer)
-              (save-excursion
-                (goto-char (point-min))
-                ;; The Newsgroup is omitted because we already matched
-                ;; based on group name in the summary buffer.
-                (dolist (field '("list-id" "to" "from" "cc"))
-                  (let ((val (mail-fetch-field field)))
-                    (when val
-                      (push val header-values))))))
-            (bug-reference--maybe-setup-from-mail nil header-values)))))))
+  (when (and bug-reference-mode ;; Only if enabled in article buffers.
+             (derived-mode-p
+              'gnus-article-mode
+              ;; Apparently, gnus-article-prepare-hook is run in the
+              ;; summary buffer...
+              'gnus-summary-mode)
+             gnus-article-buffer
+             gnus-original-article-buffer
+             (buffer-live-p (get-buffer gnus-article-buffer))
+             (buffer-live-p (get-buffer gnus-original-article-buffer)))
+    (with-current-buffer gnus-article-buffer
+      (catch 'setup-done
+        ;; Copy over the values from the summary buffer.
+        (when (and gnus-summary-buffer
+                   (buffer-live-p gnus-summary-buffer))
+          (setq-local bug-reference-bug-regexp
+                      (with-current-buffer gnus-summary-buffer
+                        bug-reference-bug-regexp))
+          (setq-local bug-reference-url-format
+                      (with-current-buffer gnus-summary-buffer
+                        bug-reference-url-format))
+          (when (and bug-reference-bug-regexp
+                     bug-reference-url-format)
+            (throw 'setup-done t)))
+        ;; If the summary had no values, try setting according to
+        ;; the values of the From, To, and Cc headers.
+        (let (header-values)
+          (with-current-buffer
+              (get-buffer gnus-original-article-buffer)
+            (save-excursion
+              (goto-char (point-min))
+              ;; The Newsgroup is omitted because we already matched
+              ;; based on group name in the summary buffer.
+              (dolist (field '("list-id" "to" "from" "cc"))
+                (let ((val (mail-fetch-field field)))
+                  (when val
+                    (push val header-values))))))
+          (bug-reference-maybe-setup-from-mail nil header-values))))))
+
+(defun bug-reference-try-setup-from-rmail ()
+  "Try setting up `bug-reference-mode' from the current rmail mail.
+Guesses suitable `bug-reference-bug-regexp' and
+`bug-reference-url-format' values by matching the current Rmail
+file's name against GROUP-REGEXP and the values of List-Id, To,
+From, and Cc against HEADER-REGEXP in
+`bug-reference-setup-from-mail-alist'."
+  (when (and bug-reference-mode
+             (derived-mode-p 'rmail-mode))
+    (let (header-values)
+      (save-excursion
+        (goto-char (point-min))
+        (dolist (field '("list-id" "to" "from" "cc"))
+          (let ((val (mail-fetch-field field)))
+            (when val
+              (push val header-values)))))
+      (bug-reference-maybe-setup-from-mail
+       (buffer-file-name) header-values))))
 
 (defvar bug-reference-setup-from-irc-alist
   `((,(concat "#" (regexp-opt '("emacs" "gnus" "org-mode" "rcirc"
@@ -351,8 +368,8 @@ and set it if applicable."
   "An alist for setting up `bug-reference-mode' in IRC modes.
 
 This takes action if `bug-reference-mode' is enabled in IRC
-channels using one of Emacs' IRC clients (rcirc and ERC).
-Currently, rcirc and ERC are supported.
+channels using one of Emacs' IRC clients.  Currently, rcirc and
+ERC are supported.
 
 Each element has the form
 
@@ -365,7 +382,7 @@ If all given entries match, BUG-REGEXP is set as
 `bug-reference-bug-regexp' and URL-FORMAT is set as
 `bug-reference-url-format'.")
 
-(defun bug-reference--maybe-setup-from-irc (channel network)
+(defun bug-reference-maybe-setup-from-irc (channel network)
   "Set up according to IRC CHANNEL or NETWORK.
 CHANNEL is an IRC channel name (or generally a target, i.e., it
 could also be a user name) and NETWORK is that channel's network
@@ -401,7 +418,7 @@ corresponding BUG-REGEXP and URL-FORMAT are set."
 Test each configuration in `bug-reference-setup-from-irc-alist'
 and set it if applicable."
   (when (derived-mode-p 'rcirc-mode)
-    (bug-reference--maybe-setup-from-irc
+    (bug-reference-maybe-setup-from-irc
      rcirc-target
      (and rcirc-server-buffer
           (buffer-live-p rcirc-server-buffer)
@@ -416,10 +433,29 @@ and set it if applicable."
 Test each configuration in `bug-reference-setup-from-irc-alist'
 and set it if applicable."
   (when (derived-mode-p 'erc-mode)
-    (bug-reference--maybe-setup-from-irc
+    (bug-reference-maybe-setup-from-irc
      (erc-format-target)
      (erc-network-name))))
 
+(defvar bug-reference-auto-setup-functions
+  (list #'bug-reference-try-setup-from-vc
+        #'bug-reference-try-setup-from-gnus
+        #'bug-reference-try-setup-from-rmail
+        #'bug-reference-try-setup-from-rcirc
+        #'bug-reference-try-setup-from-erc)
+  "Functions trying to auto-setup `bug-reference-mode'.
+These functions are run after `bug-reference-mode' has been
+activated in a buffer and try to guess suitable values for
+`bug-reference-bug-regexp' and `bug-reference-url-format'.  Their
+guesswork is based on these variables:
+
+- `bug-reference-setup-from-vc-alist' for guessing based on
+  version control, e.g., URL of repository.
+- `bug-reference-setup-from-mail-alist' for guessing based on
+  mail group names or mail header values.
+- `bug-reference-setup-from-irc-alist' for guessing based on IRC
+  channel or network names.")
+
 (defun bug-reference--run-auto-setup ()
   (when (or bug-reference-mode
             bug-reference-prog-mode)
@@ -430,10 +466,7 @@ and set it if applicable."
       (with-demoted-errors
           "Error during bug-reference auto-setup: %S"
         (catch 'setup
-          (dolist (f (list #'bug-reference-try-setup-from-vc
-                           #'bug-reference-try-setup-from-gnus
-                           #'bug-reference-try-setup-from-rcirc
-                           #'bug-reference-try-setup-from-erc))
+          (dolist (f bug-reference-auto-setup-functions)
             (when (funcall f)
               (throw 'setup t))))))))
 
@@ -448,6 +481,18 @@ and set it if applicable."
       (widen)
       (bug-reference-unfontify (point-min) (point-max)))))
 
+(defun bug-reference-mode-force-auto-setup ()
+  "Enable `bug-reference-mode' and force auto-setup.
+Enabling `bug-reference-mode' runs its auto-setup only if
+`bug-reference-bug-regexp' and `bug-reference-url-format' are not
+set already.  This function sets the latter to `nil'
+buffer-locally, so that the auto-setup will always run.
+
+This is mostly intended for MUA modes like `rmail-mode' where the
+same buffer is re-used for different contexts."
+  (setq-local bug-reference-url-format nil)
+  (bug-reference-mode))
+
 ;;;###autoload
 (define-minor-mode bug-reference-prog-mode
   "Like `bug-reference-mode', but only buttonize in comments and strings."
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 4f79fa9..5d93435 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -615,7 +615,7 @@ must not be within a `c-save-buffer-state', since the user 
then
 wouldn't be able to undo them.
 
 The return value is the value of the last form in BODY."
-  (declare (debug t) (indent 1))
+  (declare (debug let*) (indent 1))
   (if (fboundp 'with-silent-modifications)
       `(with-silent-modifications (let* ,varlist ,@body))
     `(let* ((modified (buffer-modified-p)) (buffer-undo-list t)
@@ -1653,8 +1653,7 @@ with value CHAR in the region [FROM to)."
   ;; determined by and angle bracket; or (ii) is inside a macro whose start
   ;; isn't POINT-MACRO-START doesn't count as a finishing position.
   (declare (debug t))
-  `(let ((here (point))
-        (pos (scan-lists ,from 1 1)))
+  `(let ((pos (scan-lists ,from 1 1)))
      (while (eq (char-before pos) ?>)
        (setq pos (scan-lists pos 1 1)))
      pos))
@@ -1664,8 +1663,7 @@ with value CHAR in the region [FROM to)."
   ;; determined by an angle bracket; or (ii) is inside a macro whose start
   ;; isn't POINT-MACRO-START doesn't count as a finishing position.
   (declare (debug t))
-  `(let ((here (point))
-        (pos (scan-lists ,from 1 -1)))
+  `(let ((pos (scan-lists ,from 1 -1)))
      (while (eq (char-before pos) ?<)
        (setq pos (scan-lists pos 1 1))
        (setq pos (scan-lists pos 1 -1)))
@@ -1676,8 +1674,7 @@ with value CHAR in the region [FROM to)."
   ;; determined by and angle bracket; or (ii) is inside a macro whose start
   ;; isn't POINT-MACRO-START doesn't count as a finishing position.
   (declare (debug t))
-  `(let ((here (point))
-        (pos (scan-lists ,from -1 1)))
+  `(let ((pos (scan-lists ,from -1 1)))
      (while (eq (char-after pos) ?<)
        (setq pos (scan-lists pos -1 1)))
      pos))
@@ -1687,8 +1684,7 @@ with value CHAR in the region [FROM to)."
   ;; determined by and angle bracket; or (ii) is inside a macro whose start
   ;; isn't POINT-MACRO-START doesn't count as a finishing position.
   (declare (debug t))
-  `(let ((here (point))
-        (pos (scan-lists ,from -1 -1)))
+  `(let ((pos (scan-lists ,from -1 -1)))
      (while (eq (char-after pos) ?>)
        (setq pos (scan-lists pos -1 1))
        (setq pos (scan-lists pos -1 -1)))
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 622d951..984a75c 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -6942,8 +6942,10 @@ comment at the start of cc-engine.el for more info."
        (c-go-list-forward))
       (when (equal (c-get-char-property (1- (point)) 'syntax-table)
                   c->-as-paren-syntax) ; should always be true.
-       (c-unmark-<->-as-paren (1- (point))))
-      (c-unmark-<->-as-paren pos))))
+       (c-unmark-<->-as-paren (1- (point)))
+       (c-truncate-lit-pos-cache (1- (point))))
+      (c-unmark-<->-as-paren pos)
+      (c-truncate-lit-pos-cache pos))))
 
 (defun c-clear->-pair-props (&optional pos)
   ;; POS (default point) is at a > character.  If it is marked with
@@ -6959,8 +6961,10 @@ comment at the start of cc-engine.el for more info."
        (c-go-up-list-backward))
       (when (equal (c-get-char-property (point) 'syntax-table)
                        c-<-as-paren-syntax) ; should always be true.
-       (c-unmark-<->-as-paren (point)))
-      (c-unmark-<->-as-paren pos))))
+       (c-unmark-<->-as-paren (point))
+       (c-truncate-lit-pos-cache (point)))
+      (c-unmark-<->-as-paren pos)
+      (c-truncate-lit-pos-cache pos))))
 
 (defun c-clear-<>-pair-props (&optional pos)
   ;; POS (default point) is at a < or > character.  If it has an
@@ -6993,7 +6997,8 @@ comment at the start of cc-engine.el for more info."
                 (equal (c-get-char-property (1- (point)) 'syntax-table)
                        c->-as-paren-syntax)) ; should always be true.
        (c-unmark-<->-as-paren (1- (point)))
-       (c-unmark-<->-as-paren pos))
+       (c-unmark-<->-as-paren pos)
+       (c-truncate-lit-pos-cache pos))
       t)))
 
 (defun c-clear->-pair-props-if-match-before (lim &optional pos)
@@ -7014,6 +7019,7 @@ comment at the start of cc-engine.el for more info."
                 (equal (c-get-char-property (point) 'syntax-table)
                        c-<-as-paren-syntax)) ; should always be true.
        (c-unmark-<->-as-paren (point))
+       (c-truncate-lit-pos-cache (point))
        (c-unmark-<->-as-paren pos))
       t)))
 
@@ -8057,13 +8063,14 @@ comment at the start of cc-engine.el for more info."
        ;; bracket arglist.  It's propagated through the return value
        ;; on successful completion.
        (c-record-found-types c-record-found-types)
+       (syntax-table-prop-on-< (c-get-char-property (point) 'syntax-table))
        ;; List that collects the positions after the argument
        ;; separating ',' in the arglist.
        arg-start-pos)
     ;; If the '<' has paren open syntax then we've marked it as an angle
     ;; bracket arglist before, so skip to the end.
     (if (and (not c-parse-and-markup-<>-arglists)
-            (c-get-char-property (point) 'syntax-table))
+            syntax-table-prop-on-<)
 
        (progn
          (forward-char)
@@ -8148,8 +8155,20 @@ comment at the start of cc-engine.el for more info."
                        (c-put-c-type-property (1- (car arg-start-pos))
                                               'c-<>-arg-sep)
                        (setq arg-start-pos (cdr arg-start-pos)))
+                     (when (and (not syntax-table-prop-on-<)
+                                (c-get-char-property (1- (point))
+                                                     'syntax-table))
+                       ;; Clear the now spuriously matching < of its
+                       ;; syntax-table property.  This could happen on
+                       ;; inserting "_cast" into "static <" with C-y.
+                       (save-excursion
+                         (and (c-go-list-backward)
+                              (eq (char-after) ?<)
+                              (c-truncate-lit-pos-cache (point))
+                              (c-unmark-<->-as-paren (point)))))
                      (c-mark-<-as-paren start)
-                     (c-mark->-as-paren (1- (point))))
+                     (c-mark->-as-paren (1- (point)))
+                     (c-truncate-lit-pos-cache start))
                    (setq res t)
                    nil))               ; Exit the loop.
 
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index f664849..35efadf 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -2743,7 +2743,8 @@ if this isn't nil."
 `c-recognize-<>-arglists' for details.  That language constant is
 assumed to be set if this isn't nil."
   t    nil
-  c++  '("template")
+  c++  '("template" "const_cast" "dynamic_cast" "reinterpret_cast"
+        "static_cast")
   idl  '("fixed" "string" "wstring"))
 
 (c-lang-defconst c-<>-sexp-kwds
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index a8f1662..5108549 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -2979,7 +2979,7 @@ Key bindings:
 ;; bug reporting
 
 (defconst c-mode-help-address
-  "submit@debbugs.gnu.org"
+  "bug-gnu-emacs@gnu.org"
   "Address(es) for CC Mode bug reports.")
 
 (defun c-version ()
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index bff3e60..3370df6 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -3585,7 +3585,7 @@ the sections using `cperl-pod-head-face', 
`cperl-pod-face',
                "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" ; QUOTED CONSTRUCT
                "\\|"
                ;; 1+6+2+1=10 extra () before this:
-               "\\([?/<]\\)"   ; /blah/ or ?blah? or <file*glob>
+               "\\([/<]\\)"    ; /blah/ or <file*glob>
                "\\|"
                ;; 1+6+2+1+1=11 extra () before this
                "\\<" cperl-sub-regexp "\\>" ;  sub with proto/attr
@@ -3920,7 +3920,7 @@ the sections using `cperl-pod-head-face', 
`cperl-pod-face',
                ;; 1+6+2=9 extra () before this:
                ;; "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>"
                ;; "\\|"
-               ;; "\\([?/<]\\)"        ; /blah/ or ?blah? or <file*glob>
+               ;; "\\([/<]\\)" ; /blah/ or <file*glob>
                (setq b1 (if (match-beginning 10) 10 11)
                      argument (buffer-substring
                                (match-beginning b1) (match-end b1))
@@ -3958,7 +3958,7 @@ the sections using `cperl-pod-head-face', 
`cperl-pod-face',
                (goto-char (match-beginning b1))
                (cperl-backward-to-noncomment (point-min))
                (or bb
-                   (if (eq b1 11)      ; bare /blah/ or ?blah? or <foo>
+                   (if (eq b1 11)      ; bare /blah/ or <foo>
                        (setq argument ""
                              b1 nil
                              bb        ; Not a regexp?
@@ -3966,7 +3966,7 @@ the sections using `cperl-pod-head-face', 
`cperl-pod-face',
                               ;; What is below: regexp-p?
                               (and
                                (or (memq (preceding-char)
-                                         (append (if (memq c '(?\? ?\<))
+                                         (append (if (char-equal c ?\<)
                                                      ;; $a++ ? 1 : 2
                                                      "~{(=|&*!,;:["
                                                    "~{(=|&+-*!,;:[") nil))
@@ -3977,14 +3977,11 @@ the sections using `cperl-pod-head-face', 
`cperl-pod-face',
                                           (forward-sexp -1)
 ;; After these keywords `/' starts a RE.  One should add all the
 ;; functions/builtins which expect an argument, but ...
-                                          (if (eq (preceding-char) ?-)
-                                              ;; -d ?foo? is a RE
-                                              (looking-at "[a-zA-Z]\\>")
                                             (and
                                              (not (memq (preceding-char)
                                                         '(?$ ?@ ?& ?%)))
                                              (looking-at
-                                              
"\\(while\\|if\\|unless\\|until\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\|say\\|return\\)\\>")))))
+                                              
"\\(while\\|if\\|unless\\|until\\|for\\(each\\)?\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\|say\\|return\\)\\>"))))
                                    (and (eq (preceding-char) ?.)
                                         (eq (char-after (- (point) 2)) ?.))
                                    (bobp))
@@ -7232,8 +7229,7 @@ $~        The name of the current report format.
 ... >= ...     Numeric greater than or equal to.
 ... >> ...     Bitwise shift right.
 ... >>= ...    Bitwise shift right assignment.
-... ? ... : ...        Condition=if-then-else operator.   ?PAT? One-time 
pattern match.
-?PATTERN?      One-time pattern match.
+... ? ... : ...        Condition=if-then-else operator.
 @ARGV  Command line arguments (not including the command name - see $0).
 @INC   List of places to look for perl scripts during do/include/use.
 @_    Parameter array for subroutines; result of split() unless in list 
context.
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index a690d4b..a56c709 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -183,7 +183,7 @@ All commands in `lisp-mode-shared-map' are inherited by 
this map.")
 Load the compiled code when finished.
 
 Use `emacs-lisp-byte-compile-and-load' in combination with
-`comp-deferred-compilation' set to `t' to achieve asynchronous
+`native-comp-deferred-compilation' set to `t' to achieve asynchronous
 native compilation."
   (interactive nil emacs-lisp-mode)
   (emacs-lisp--before-compile-buffer)
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 13717b1..f0180ce 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1808,7 +1808,7 @@ argument is passed to `next-file', which see)."
 (defun tags-search (regexp &optional files)
   "Search through all files listed in tags table for match for REGEXP.
 Stops when a match is found.
-To continue searching for next match, use command \\[tags-loop-continue].
+To continue searching for next match, use the command \\[fileloop-continue].
 
 If FILES if non-nil should be a list or an iterator returning the
 files to search.  The search will be restricted to these files.
@@ -1834,7 +1834,7 @@ Also see the documentation of the `tags-file-name' 
variable."
   "Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
 If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
-with the command \\[tags-loop-continue].
+with the command \\[fileloop-continue].
 For non-interactive use, superseded by `fileloop-initialize-replace'."
   (declare (advertised-calling-convention (from to &optional delimited) 
"27.1"))
   (interactive (query-replace-read-args "Tags query replace (regexp)" t t))
diff --git a/lisp/progmodes/fortran.el b/lisp/progmodes/fortran.el
index 3bef398..707226f 100644
--- a/lisp/progmodes/fortran.el
+++ b/lisp/progmodes/fortran.el
@@ -650,74 +650,6 @@ Used in the Fortran entry in `hs-special-modes-alist'.")
     (define-key map "7" 'fortran-electric-line-number)
     (define-key map "8" 'fortran-electric-line-number)
     (define-key map "9" 'fortran-electric-line-number)
-
-    (easy-menu-define fortran-menu map "Menu for Fortran mode."
-      `("Fortran"
-        ["Manual" (info "(emacs)Fortran") :active t
-         :help "Read the Emacs manual chapter on Fortran mode"]
-        ("Customization"
-         ,(custom-menu-create 'fortran)
-         ;; FIXME useless?
-         ["Set"  Custom-set :active t
-          :help "Set current value of all edited settings in the buffer"]
-         ["Save" Custom-save :active t
-          :help "Set and save all edited settings"]
-         ["Reset to Current" Custom-reset-current :active t
-          :help "Reset all edited settings to current"]
-         ["Reset to Saved" Custom-reset-saved :active t
-          :help "Reset all edited or set settings to saved"]
-         ["Reset to Standard Settings" Custom-reset-standard :active t
-          :help "Erase all customizations in buffer"]
-         )
-        "--"
-        ["Comment Region" fortran-comment-region mark-active]
-        ["Uncomment Region"
-         (fortran-comment-region (region-beginning) (region-end) 1)
-         mark-active]
-        ["Indent Region"     indent-region mark-active]
-        ["Indent Subprogram" fortran-indent-subprogram t]
-        "--"
-        ["Beginning of Subprogram" fortran-beginning-of-subprogram :active t
-         :help "Move point to the start of the current subprogram"]
-        ["End of Subprogram" fortran-end-of-subprogram :active t
-         :help "Move point to the end of the current subprogram"]
-        ("Mark"
-         :help "Mark a region of code"
-         ["Subprogram" mark-defun      t]
-         ["IF Block"   fortran-mark-if t]
-         ["DO Block"   fortran-mark-do t]
-         )
-        ["Narrow to Subprogram" narrow-to-defun t]
-        ["Widen" widen t]
-        "--"
-        ["Temporary Column Ruler" fortran-column-ruler :active t
-         :help "Briefly display Fortran column numbers"]
-        ;; May not be '72', depending on fortran-line-length, but this
-        ;; seems ok for a menu item.
-        ["72-column Window" fortran-window-create :active t
-         :help "Set window width to Fortran line length"]
-        ["Full Width Window"
-         (enlarge-window-horizontally (- (frame-width) (window-width)))
-         :active (not (window-full-width-p))
-         :help "Make window full width"]
-        ["Momentary 72-Column Window" fortran-window-create-momentarily
-         :active t :help "Briefly set window width to Fortran line length"]
-        "--"
-        ["Break Line at Point" fortran-split-line :active t
-         :help "Break the current line at point"]
-        ["Join Line" fortran-join-line :active t
-         :help "Join the current line to the previous one"]
-        ["Fill Statement/Comment" fill-paragraph t]
-        "--"
-        ["Toggle Auto Fill" auto-fill-mode :selected auto-fill-function
-         :style toggle
-         :help "Automatically fill text while typing in this buffer"]
-        ["Toggle Abbrev Mode" abbrev-mode :selected abbrev-mode
-         :style toggle :help "Expand abbreviations while typing in this 
buffer"]
-        ["Add Imenu Menu" imenu-add-menubar-index
-         :active   (not (lookup-key (current-local-map) [menu-bar index]))
-         :included (fboundp 'imenu-add-to-menubar)
-         :help "Add an index menu to the menu-bar"]))
     map)
   "Keymap used in Fortran mode.")
 
@@ -2209,6 +2141,81 @@ arg DO-SPACE prevents stripping the whitespace."
                                                                (point)))))
         "main"))))
 
+;; The menu is defined at the end because `custom-menu-create' is
+;; called at load time and will result in (recursively) loading this
+;; file otherwise.
+(easy-menu-define fortran-menu fortran-mode-map "Menu for Fortran mode."
+  `("Fortran"
+    ["Manual" (info "(emacs)Fortran") :active t
+     :help "Read the Emacs manual chapter on Fortran mode"]
+    ("Customization"
+     ,(progn
+        ;; Tell the byte compiler that `features' is lexical.
+        (with-no-warnings (defvar features))
+        (let ((features (cons 'fortran features)))
+          (custom-menu-create 'fortran)))
+     ;; FIXME useless?
+     ["Set"  Custom-set :active t
+      :help "Set current value of all edited settings in the buffer"]
+     ["Save" Custom-save :active t
+      :help "Set and save all edited settings"]
+     ["Reset to Current" Custom-reset-current :active t
+      :help "Reset all edited settings to current"]
+     ["Reset to Saved" Custom-reset-saved :active t
+      :help "Reset all edited or set settings to saved"]
+     ["Reset to Standard Settings" Custom-reset-standard :active t
+      :help "Erase all customizations in buffer"]
+     )
+    "--"
+    ["Comment Region" fortran-comment-region mark-active]
+    ["Uncomment Region"
+     (fortran-comment-region (region-beginning) (region-end) 1)
+     mark-active]
+    ["Indent Region"     indent-region mark-active]
+    ["Indent Subprogram" fortran-indent-subprogram t]
+    "--"
+    ["Beginning of Subprogram" fortran-beginning-of-subprogram :active t
+     :help "Move point to the start of the current subprogram"]
+    ["End of Subprogram" fortran-end-of-subprogram :active t
+     :help "Move point to the end of the current subprogram"]
+    ("Mark"
+     :help "Mark a region of code"
+     ["Subprogram" mark-defun      t]
+     ["IF Block"   fortran-mark-if t]
+     ["DO Block"   fortran-mark-do t]
+     )
+    ["Narrow to Subprogram" narrow-to-defun t]
+    ["Widen" widen t]
+    "--"
+    ["Temporary Column Ruler" fortran-column-ruler :active t
+     :help "Briefly display Fortran column numbers"]
+    ;; May not be '72', depending on fortran-line-length, but this
+    ;; seems ok for a menu item.
+    ["72-column Window" fortran-window-create :active t
+     :help "Set window width to Fortran line length"]
+    ["Full Width Window"
+     (enlarge-window-horizontally (- (frame-width) (window-width)))
+     :active (not (window-full-width-p))
+     :help "Make window full width"]
+    ["Momentary 72-Column Window" fortran-window-create-momentarily
+     :active t :help "Briefly set window width to Fortran line length"]
+    "--"
+    ["Break Line at Point" fortran-split-line :active t
+     :help "Break the current line at point"]
+    ["Join Line" fortran-join-line :active t
+     :help "Join the current line to the previous one"]
+    ["Fill Statement/Comment" fill-paragraph t]
+    "--"
+    ["Toggle Auto Fill" auto-fill-mode :selected auto-fill-function
+     :style toggle
+     :help "Automatically fill text while typing in this buffer"]
+    ["Toggle Abbrev Mode" abbrev-mode :selected abbrev-mode
+     :style toggle :help "Expand abbreviations while typing in this buffer"]
+    ["Add Imenu Menu" imenu-add-menubar-index
+     :active   (not (lookup-key (current-local-map) [menu-bar index]))
+     :included (fboundp 'imenu-add-to-menubar)
+     :help "Add an index menu to the menu-bar"]))
+
 (provide 'fortran)
 
 ;;; fortran.el ends here
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 1a96755..aa33652 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -101,6 +101,19 @@
 (declare-function speedbar-delete-subblock "speedbar" (indent))
 (declare-function speedbar-center-buffer-smartly "speedbar" ())
 
+;; FIXME: The declares below are necessary because we don't call `gud-def'
+;; at toplevel, so the compiler doesn't know under which circumstances
+;; they're defined.
+(declare-function gud-until  "gud" (arg))
+(declare-function gud-print  "gud" (arg))
+(declare-function gud-down   "gud" (arg))
+(declare-function gud-up     "gud" (arg))
+(declare-function gud-jump   "gud" (arg))
+(declare-function gud-finish "gud" (arg))
+(declare-function gud-next   "gud" (arg))
+(declare-function gud-stepi  "gud" (arg))
+(declare-function gud-tbreak "gud" (arg))
+
 (defvar tool-bar-map)
 (defvar speedbar-initial-expansion-list-name)
 (defvar speedbar-frame)
@@ -4512,7 +4525,7 @@ overlay arrow in source buffer."
   (let ((frame (gdb-mi--field (gdb-mi--partial-output) 'frame)))
     (when frame
       (setq gdb-selected-frame (gdb-mi--field frame 'func))
-      (setq gdb-selected-file (gdb-mi--field frame 'fullname))
+      (setq gdb-selected-file (file-local-name (gdb-mi--field frame 
'fullname)))
       (setq gdb-frame-number (gdb-mi--field frame 'level))
       (setq gdb-frame-address (gdb-mi--field frame 'addr))
       (let ((line (gdb-mi--field frame 'line)))
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index e9fbcbb..462ea51 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -473,7 +473,7 @@ buffer `default-directory'."
       (1 (if (eq (char-after (match-beginning 1)) ?\0)
              `(face nil display ,(match-string 2)))))
      ;; Hide excessive part of rgrep command
-     ("^find \\(\\. -type d .*\\\\)\\)"
+     ("^find \\(\\(?:-H \\)?\\. -type d .*\\(?:\\\\)\\|\")\"\\)\\)"
       (1 (if grep-find-abbreviate grep-find-abbreviate-properties
            '(face nil abbreviated-command t))))
      ;; Hide excessive part of lgrep command
@@ -774,25 +774,24 @@ The value depends on `grep-command', `grep-template',
                (let ((gcmd (format "%s <C> %s <R>"
                                    grep-program grep-options))
                      (null (if grep-use-null-device
-                               (format "%s " (null-device))
-                             "")))
-                 (cond ((eq grep-find-use-xargs 'gnu)
-                        (format "%s <D> <X> -type f <F> -print0 | \"%s\" -0 %s"
-                                find-program xargs-program gcmd))
-                       ((eq grep-find-use-xargs 'gnu-sort)
-                        (format "%s <D> <X> -type f <F> -print0 | sort -z | 
\"%s\" -0 %s"
-                                find-program xargs-program gcmd))
-                       ((eq grep-find-use-xargs 'exec)
-                        (format "%s <D> <X> -type f <F> -exec %s %s %s%s"
-                                find-program gcmd quot-braces null 
quot-scolon))
-                       ((eq grep-find-use-xargs 'exec-plus)
-                        (format "%s <D> <X> -type f <F> -exec %s %s%s +"
-                                find-program gcmd null quot-braces))
-                       (t
-                        (format "%s <D> <X> -type f <F> -print | \"%s\" %s"
-                                find-program xargs-program gcmd))))))))
-
-    ;; Save defaults for this host.
+                                (format "%s " (null-device))
+                              "")))
+                  (cond ((eq grep-find-use-xargs 'gnu)
+                         (format "%s -H <D> <X> -type f <F> -print0 | \"%s\" 
-0 %s"
+                                 find-program xargs-program gcmd))
+                        ((eq grep-find-use-xargs 'gnu-sort)
+                         (format "%s -H <D> <X> -type f <F> -print0 | sort -z 
| \"%s\" -0 %s"
+                                 find-program xargs-program gcmd))
+                        ((eq grep-find-use-xargs 'exec)
+                         (format "%s -H <D> <X> -type f <F> -exec %s %s %s%s"
+                                 find-program gcmd quot-braces null 
quot-scolon))
+                        ((eq grep-find-use-xargs 'exec-plus)
+                         (format "%s -H <D> <X> -type f <F> -exec %s %s%s +"
+                                 find-program gcmd null quot-braces))
+                        (t
+                         (format "%s -H <D> <X> -type f <F> -print | \"%s\" %s"
+                                 find-program xargs-program gcmd))))))))
+     ;; Save defaults for this host.
     (setq grep-host-defaults-alist
          (delete (assq host-id grep-host-defaults-alist)
                  grep-host-defaults-alist))
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index a37477d..740a6e2 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -50,6 +50,30 @@
 (defvar hl-line-mode)
 (defvar hl-line-sticky-flag)
 
+(declare-function gdb-tooltip-print "gdb-mi" (expr))
+(declare-function gdb-tooltip-print-1 "gdb-mi" (expr))
+(declare-function gud-pp "gdb-mi" (arg))
+(declare-function gdb-var-delete "gdb-mi" ())
+(declare-function speedbar-toggle-line-expansion "gud" ())
+(declare-function speedbar-edit-line "gud" ())
+;; FIXME: The declares below are necessary because we don't call `gud-def'
+;; at toplevel, so the compiler doesn't know under which circumstances
+;; they're defined.
+(declare-function gud-statement "gud" (arg))
+(declare-function gud-until     "gud" (arg))
+(declare-function gud-pv        "gud" (arg))
+(declare-function gud-print     "gud" (arg))
+(declare-function gud-down      "gud" (arg))
+(declare-function gud-up        "gud" (arg))
+(declare-function gud-jump      "gud" (arg))
+(declare-function gud-finish    "gud" (arg))
+(declare-function gud-cont      "gud" (arg))
+(declare-function gud-next      "gud" (arg))
+(declare-function gud-stepi     "gud" (arg))
+(declare-function gud-step      "gud" (arg))
+(declare-function gud-remove    "gud" (arg))
+(declare-function gud-tbreak    "gud" (arg))
+(declare-function gud-break     "gud" (arg))
 
 ;; ======================================================================
 ;; GUD commands must be visible in C buffers visited by GUD
@@ -66,7 +90,7 @@ pdb (Python), and jdb."
   "Prefix of all GUD commands valid in C buffers."
   :type 'key-sequence)
 
-(global-set-key (vconcat gud-key-prefix "\C-l") 'gud-refresh)
+(global-set-key (vconcat gud-key-prefix "\C-l") #'gud-refresh)
 ;; (define-key ctl-x-map " " 'gud-break); backward compatibility hack
 
 (defvar gud-marker-filter nil)
@@ -150,10 +174,11 @@ Used to gray out relevant toolbar icons.")
                                    (or (not (gdb-show-run-p))
                                        (bound-and-true-p
                                         gdb-active-process)))))
-    ([go]      menu-item (if (bound-and-true-p gdb-active-process)
-                             "Continue" "Run") gud-go
+    ([go]     .        (menu-item (if (bound-and-true-p gdb-active-process)
+                              "Continue" "Run")
+                          gud-go
                  :visible (and (eq gud-minor-mode 'gdbmi)
-                                (gdb-show-run-p)))
+                                (gdb-show-run-p))))
     ([stop]    menu-item "Stop" gud-stop-subjob
                  :visible (or (not (memq gud-minor-mode '(gdbmi pdb)))
                               (and (eq gud-minor-mode 'gdbmi)
@@ -185,13 +210,15 @@ Used to gray out relevant toolbar icons.")
                                  (bound-and-true-p gdb-active-process))
                  :visible (and (string-equal
                                 (buffer-local-value
-                                 'gud-target-name gud-comint-buffer) "emacs")
+                                 'gud-target-name gud-comint-buffer)
+                                "emacs")
                                (eq gud-minor-mode 'gdbmi)))
-    ([print*]  menu-item (if (eq gud-minor-mode 'jdb)
-                             "Dump object"
-                           "Print Dereference") gud-pstar
+    ([print*] . (menu-item (if (eq gud-minor-mode 'jdb)
+                              "Dump object"
+                            "Print Dereference")
+                          gud-pstar
                   :enable (not gud-running)
-                 :visible (memq gud-minor-mode '(gdbmi gdb jdb)))
+                 :visible (memq gud-minor-mode '(gdbmi gdb jdb))))
     ([print]   menu-item "Print Expression" gud-print
                   :enable (not gud-running))
     ([watch]   menu-item "Watch Expression" gud-watch
@@ -336,7 +363,7 @@ Uses `gud-<MINOR-MODE>-directories' to find the source 
files."
                   (eq gud-minor-mode 'gdbmi))
          (make-local-variable 'gdb-define-alist)
          (unless  gdb-define-alist (gdb-create-define-alist))
-         (add-hook 'after-save-hook 'gdb-create-define-alist nil t))
+         (add-hook 'after-save-hook #'gdb-create-define-alist nil t))
        (make-local-variable 'gud-keep-buffer))
       buf)))
 
@@ -383,8 +410,8 @@ we're in the GUD buffer)."
              `(gud-call ,cmd arg)
            ;; Unused lexical warning if cmd does not use "arg".
            cmd))))
-     ,(if key `(local-set-key ,(concat "\C-c" key) ',func))
-     ,(if key `(global-set-key (vconcat gud-key-prefix ,key) ',func))))
+     ,(if key `(local-set-key ,(concat "\C-c" key) #',func))
+     ,(if key `(global-set-key (vconcat gud-key-prefix ,key) #',func))))
 
 ;; Where gud-display-frame should put the debugging arrow; a cons of
 ;; (filename . line-number).  This is set by the marker-filter, which scans
@@ -450,12 +477,12 @@ The value t means that there is no stack, and we are in 
display-file mode.")
   "Install those variables used by speedbar to enhance gud/gdb."
   (unless gud-speedbar-key-map
     (setq gud-speedbar-key-map (speedbar-make-specialized-keymap))
-    (define-key gud-speedbar-key-map "j" 'speedbar-edit-line)
-    (define-key gud-speedbar-key-map "e" 'speedbar-edit-line)
-    (define-key gud-speedbar-key-map "\C-m" 'speedbar-edit-line)
-    (define-key gud-speedbar-key-map " " 'speedbar-toggle-line-expansion)
-    (define-key gud-speedbar-key-map "D" 'gdb-var-delete)
-    (define-key gud-speedbar-key-map "p" 'gud-pp))
+    (define-key gud-speedbar-key-map "j" #'speedbar-edit-line)
+    (define-key gud-speedbar-key-map "e" #'speedbar-edit-line)
+    (define-key gud-speedbar-key-map "\C-m" #'speedbar-edit-line)
+    (define-key gud-speedbar-key-map " " #'speedbar-toggle-line-expansion)
+    (define-key gud-speedbar-key-map "D" #'gdb-var-delete)
+    (define-key gud-speedbar-key-map "p" #'gud-pp))
 
   (speedbar-add-expansion-list '("GUD" gud-speedbar-menu-items
                                 gud-speedbar-key-map
@@ -625,8 +652,7 @@ required by the caller."
 (defcustom gud-gud-gdb-command-name "gdb --fullname"
   "Default command to run an executable under GDB in text command mode.
 The option \"--fullname\" must be included in this value."
-   :type 'string
-   :group 'gud)
+   :type 'string)
 
 (defvar gud-gdb-marker-regexp
   ;; This used to use path-separator instead of ":";
@@ -801,9 +827,9 @@ the buffer in which this command was invoked."
 
   (add-hook 'completion-at-point-functions #'gud-gdb-completion-at-point
             nil 'local)
-  (setq-local gud-gdb-completion-function 'gud-gdb-completions)
+  (setq-local gud-gdb-completion-function #'gud-gdb-completions)
 
-  (local-set-key "\C-i" 'completion-at-point)
+  (local-set-key "\C-i" #'completion-at-point)
   (setq comint-prompt-regexp "^(.*gdb[+]?) *")
   (setq paragraph-start comint-prompt-regexp)
   (setq gdb-first-prompt t)
@@ -2182,9 +2208,9 @@ extension EXTN.  Normally EXTN is given as the regular 
expression
   (setq gud-jdb-analysis-buffer (get-buffer-create " *gud-jdb-scratch*"))
   (prog1
       (apply
-       'nconc
+       #'nconc
        (mapcar
-       'gud-jdb-build-class-source-alist-for-file
+       #'gud-jdb-build-class-source-alist-for-file
        sources))
     (kill-buffer gud-jdb-analysis-buffer)
     (setq gud-jdb-analysis-buffer nil)))
@@ -2251,13 +2277,14 @@ relative to a classpath directory."
        ;; name relative to classpath
        (filename
        (concat
-        (mapconcat 'identity
+        (mapconcat #'identity
                    (split-string
                     ;; Eliminate any subclass references in the class
                     ;; name string. These start with a "$"
                      (if (string-match "\\$.*" p)
                          (replace-match "" t t p) p)
-                    "\\.") "/")
+                    "\\.")
+                   "/")
         ".java"))
        (cplist (append gud-jdb-sourcepath gud-jdb-classpath))
        found-file)
@@ -2279,7 +2306,7 @@ during jdb initialization depending on the value of
   "Parse the classpath list and convert each item to an absolute pathname."
   (mapcar (lambda (s) (if (string-match "[/\\]$" s)
                          (replace-match "" nil nil s) s))
-         (mapcar 'file-truename
+         (mapcar #'file-truename
                  (split-string
                   string
                   (concat "[ \t\n\r,\"" path-separator "]+")))))
@@ -2458,7 +2485,7 @@ gud, see `gud-mode'."
        (if (string-match "-attach" command-line)
            (gud-call "classpath"))
        (fset 'gud-jdb-find-source
-             'gud-jdb-find-source-using-classpath))
+             #'gud-jdb-find-source-using-classpath))
 
     ;; Else create and bind the class/source association list as well
     ;; as the source file list.
@@ -2466,8 +2493,8 @@ gud, see `gud-mode'."
          (gud-jdb-build-class-source-alist
           (setq gud-jdb-source-files
                 (gud-jdb-build-source-files-list gud-jdb-directories
-                                                 "\\.java$"))))
-    (fset 'gud-jdb-find-source 'gud-jdb-find-source-file)))
+                                                 "\\.java\\'"))))
+    (fset 'gud-jdb-find-source #'gud-jdb-find-source-file)))
 
 ;;
 ;; End of debugger-specific information
@@ -2578,7 +2605,7 @@ Commands:
 
 \\{gud-mode-map}"
   (setq mode-line-process '(":%s"))
-  (define-key (current-local-map) "\C-c\C-l" 'gud-refresh)
+  (define-key (current-local-map) "\C-c\C-l" #'gud-refresh)
   (setq-local gud-last-frame nil)
   (if (boundp 'tool-bar-map)            ; not --without-x
       (setq-local tool-bar-map gud-tool-bar-map))
@@ -2587,7 +2614,7 @@ Commands:
   (setq-local comint-input-ignoredups t)
   (make-local-variable 'paragraph-start)
   (setq-local gud-delete-prompt-marker (make-marker))
-  (add-hook 'kill-buffer-hook 'gud-kill-buffer-hook nil t))
+  (add-hook 'kill-buffer-hook #'gud-kill-buffer-hook nil t))
 
 (defcustom gud-chdir-before-run t
   "Non-nil if GUD should `cd' to the debugged executable."
@@ -2654,7 +2681,7 @@ Commands:
        (setq w (cdr w)))
       ;; Tramp has already been loaded if we are here.
       (if w (setcar w (setq file (file-local-name file)))))
-    (apply 'make-comint (concat "gud" filepart) program nil
+    (apply #'make-comint (concat "gud" filepart) program nil
           (if massage-args (funcall massage-args file args) args))
     ;; Since comint clobbered the mode, we don't set it until now.
     (gud-mode)
@@ -2664,8 +2691,8 @@ Commands:
   (if find-file (setq-local gud-find-file find-file))
   (setq gud-last-last-frame nil)
 
-  (set-process-filter (get-buffer-process (current-buffer)) 'gud-filter)
-  (set-process-sentinel (get-buffer-process (current-buffer)) 'gud-sentinel)
+  (set-process-filter (get-buffer-process (current-buffer)) #'gud-filter)
+  (set-process-sentinel (get-buffer-process (current-buffer)) #'gud-sentinel)
   (gud-set-buffer))
 
 (defun gud-set-buffer ()
@@ -3186,10 +3213,11 @@ class of the file (using s to separate nested class 
ids)."
           (while (and cplist (not class-found))
             (if (string-match (car cplist) f)
                 (setq class-found
-                     (mapconcat 'identity
+                     (mapconcat #'identity
                                  (split-string
                                    (substring f (+ (match-end 0) 1))
-                                  "/") ".")))
+                                   "/")
+                                 ".")))
             (setq cplist (cdr cplist)))
           ;; if f is visited by a java(cc-mode) buffer, walk up the
           ;; syntactic information chain and collect any 'inclass
@@ -3228,7 +3256,7 @@ class of the file (using s to separate nested class ids)."
                       ))
                   (string-match (concat (car nclass) "$") class-found)
                   (setq class-found
-                        (replace-match (mapconcat 'identity nclass "$")
+                        (replace-match (mapconcat #'identity nclass "$")
                                        t t class-found)))))
           (if (not class-found)
               (message "gud-find-class: class for file %s not found!" f))
@@ -3362,7 +3390,7 @@ Treats actions as defuns."
   (setq-local outline-regexp "[ \t]")
   (setq-local imenu-generic-expression
               '((nil "^define[ \t]+\\(\\w+\\)" 1)))
-  (setq-local indent-line-function 'gdb-script-indent-line)
+  (setq-local indent-line-function #'gdb-script-indent-line)
   (setq-local beginning-of-defun-function
               #'gdb-script-beginning-of-defun)
   (setq-local end-of-defun-function
@@ -3393,14 +3421,14 @@ Treats actions as defuns."
   (require 'tooltip)
   (if gud-tooltip-mode
       (progn
-       (add-hook 'change-major-mode-hook 'gud-tooltip-change-major-mode)
-       (add-hook 'pre-command-hook 'tooltip-hide)
-       (add-hook 'tooltip-functions 'gud-tooltip-tips)
-       (define-key global-map [mouse-movement] 'gud-tooltip-mouse-motion))
-    (unless tooltip-mode (remove-hook 'pre-command-hook 'tooltip-hide)
-    (remove-hook 'change-major-mode-hook 'gud-tooltip-change-major-mode)
-    (remove-hook 'tooltip-functions 'gud-tooltip-tips)
-    (define-key global-map [mouse-movement] 'ignore)))
+       (add-hook 'change-major-mode-hook #'gud-tooltip-change-major-mode)
+       (add-hook 'pre-command-hook #'tooltip-hide)
+       (add-hook 'tooltip-functions #'gud-tooltip-tips)
+       (define-key global-map [mouse-movement] #'gud-tooltip-mouse-motion))
+    (unless tooltip-mode (remove-hook 'pre-command-hook #'tooltip-hide)
+    (remove-hook 'change-major-mode-hook #'gud-tooltip-change-major-mode)
+    (remove-hook 'tooltip-functions #'gud-tooltip-tips)
+    (define-key global-map [mouse-movement] #'ignore)))
   (gud-tooltip-activate-mouse-motions-if-enabled)
   (if (and gud-comint-buffer
           (buffer-name gud-comint-buffer); gud-comint-buffer might be killed
@@ -3417,9 +3445,9 @@ Treats actions as defuns."
                    (make-local-variable 'gdb-define-alist)
                    (gdb-create-define-alist)
                    (add-hook 'after-save-hook
-                             'gdb-create-define-alist nil t))))))
+                             #'gdb-create-define-alist nil t))))))
        (kill-local-variable 'gdb-define-alist)
-       (remove-hook 'after-save-hook 'gdb-create-define-alist t))))
+       (remove-hook 'after-save-hook #'gdb-create-define-alist t))))
 
 (defcustom gud-tooltip-modes '(gud-mode c-mode c++-mode fortran-mode
                                        python-mode)
@@ -3450,12 +3478,12 @@ only tooltips in the buffer containing the overlay 
arrow."
 
 (defun gud-tooltip-change-major-mode ()
   "Function added to `change-major-mode-hook' when tooltip mode is on."
-  (add-hook 'post-command-hook 'gud-tooltip-activate-mouse-motions-if-enabled))
+  (add-hook 'post-command-hook 
#'gud-tooltip-activate-mouse-motions-if-enabled))
 
 (defun gud-tooltip-activate-mouse-motions-if-enabled ()
   "Reconsider for all buffers whether mouse motion events are desired."
   (remove-hook 'post-command-hook
-              'gud-tooltip-activate-mouse-motions-if-enabled)
+              #'gud-tooltip-activate-mouse-motions-if-enabled)
   (dolist (buffer (buffer-list))
     (with-current-buffer buffer
       (if (and gud-tooltip-mode
@@ -3564,7 +3592,7 @@ This function must return nil if it doesn't handle EVENT."
               (posn-point (event-end event))
               (or (and (eq gud-minor-mode 'gdbmi) (not gdb-active-process))
                   (progn (setq gud-tooltip-event event)
-                         (eval (cons 'and gud-tooltip-display)))))
+                         (eval (cons 'and gud-tooltip-display) t))))
       (let ((expr (tooltip-expr-to-print event)))
        (when expr
          (if (and (eq gud-minor-mode 'gdbmi)
@@ -3594,10 +3622,10 @@ so they have been disabled."))
                         (gdb-input
                          (concat
                          "server macro expand " expr "\n")
-                        `(lambda () (gdb-tooltip-print-1 ,expr)))
+                        (lambda () (gdb-tooltip-print-1 expr)))
                       (gdb-input
                       (concat cmd "\n")
-                      `(lambda () (gdb-tooltip-print ,expr))))
+                      (lambda () (gdb-tooltip-print expr))))
                   (add-function :override (process-filter process)
                                 #'gud-tooltip-process-output)
                  (gud-basic-call cmd))
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index 0d9b4b7..4a1da62 100644
--- a/lisp/progmodes/hideif.el
+++ b/lisp/progmodes/hideif.el
@@ -55,10 +55,10 @@
 ;; Use M-x hide-ifdef-undef (C-c @ u) to undefine a symbol.
 ;;
 ;; If you define or undefine a symbol while hide-ifdef-mode is in effect,
-;; the display will be updated.  Only the define list for the current
-;; buffer will be affected.  You can save changes to the local define
-;; list with hide-ifdef-set-define-alist.  This adds entries
-;; to hide-ifdef-define-alist.
+;; the display will be updated.  The global define list hide-ifdef-env
+;; is affected accordingly.  You can save changes to this globally define
+;; list with hide-ifdef-set-define-alist.  This adds entries to
+;; hide-ifdef-define-alist.
 ;;
 ;; If you have defined a hide-ifdef-mode-hook, you can set
 ;; up a list of symbols that may be used by hide-ifdefs as in the
@@ -68,10 +68,19 @@
 ;;      (lambda ()
 ;;      (unless hide-ifdef-define-alist
 ;;        (setq hide-ifdef-define-alist
-;;             '((list1 ONE TWO)
-;;               (list2 TWO THREE))))
+;;             '((list1 (ONE . 1) (TWO . 2))
+;;               (list2 (TWO . 2) (THREE . 3)))))
 ;;      (hide-ifdef-use-define-alist 'list2))) ; use list2 by default
 ;;
+;; Currently recursive #include is not yet supported, a quick and reliable
+;; way is to let the compiler generates all the #include-d defined macros
+;; into a file, then open it in Emacs with hide-ifdefs (C-c @ h).
+;; Take gcc and hello.c for example, hello.c #include-s <stdio.h>:
+;;
+;;   $ gcc -dM -E hello.c -o hello.hh
+;;
+;; Then, open hello.hh and perform hide-ifdefs.
+;;
 ;; You can call hide-ifdef-use-define-alist (C-c @ U) at any time to specify
 ;; another list to use.
 ;;
@@ -99,7 +108,11 @@
 ;; Extensively modified by Daniel LaLiberte (while at Gould).
 ;;
 ;; Extensively modified by Luke Lee in 2013 to support complete C expression
-;; evaluation and argumented macro expansion.
+;; evaluation and argumented macro expansion; C++11, C++14, C++17, GCC
+;; extension literals and gcc/clang matching behaviours are supported in 2021.
+;; Various floating point types and operations are also supported but the
+;; actual precision is limited by the Emacs internal floating representation,
+;; which is the C data type "double" or IEEE binary64 format.
 
 ;;; Code:
 
@@ -136,7 +149,10 @@
   :type '(choice (const nil) string)
   :version "25.1")
 
-(defcustom hide-ifdef-expand-reinclusion-protection t
+(define-obsolete-variable-alias 'hide-ifdef-expand-reinclusion-protection
+  'hide-ifdef-expand-reinclusion-guard "28.1")
+
+(defcustom hide-ifdef-expand-reinclusion-guard t
   "Non-nil means don't hide an entire header file enclosed by #ifndef...#endif.
 Most C/C++ headers are usually wrapped with ifdefs to prevent re-inclusion:
 
@@ -161,7 +177,7 @@ outermost #if is always visible."
 (defcustom hide-ifdef-header-regexp
   "\\.h\\(h\\|xx\\|pp\\|\\+\\+\\)?\\'"
   "C/C++ header file name patterns to determine if current buffer is a header.
-Effective only if `hide-ifdef-expand-reinclusion-protection' is t."
+Effective only if `hide-ifdef-expand-reinclusion-guard' is t."
   :type 'regexp
   :version "25.1")
 
@@ -195,6 +211,21 @@ Effective only if 
`hide-ifdef-expand-reinclusion-protection' is t."
   :type 'key-sequence
   :version "27.1")
 
+(defcustom hide-ifdef-verbose nil
+  "Show some defining symbols on hiding for a visible feedback."
+  :type 'boolean
+  :version "28.1")
+
+(defcustom hide-ifdef-evalulate-enter-hook nil
+  "Hook function to be called when entering `hif-evaluate-macro'."
+  :type 'hook
+  :version "28.1")
+
+(defcustom hide-ifdef-evalulate-leave-hook nil
+  "Hook function to be called when leaving `hif-evaluate-macro'."
+  :type 'hook
+  :version "28.1")
+
 (defvar hide-ifdef-mode-map
   ;; Set up the mode's main map, which leads via the prefix key to the submap.
   (let ((map (make-sparse-keymap)))
@@ -306,9 +337,9 @@ Several variables affect how the hiding is done:
 ;;           (default-value 'hide-ifdef-env))
         (setq hide-ifdef-env (default-value 'hide-ifdef-env))
         ;; Some C/C++ headers might have other ways to prevent reinclusion and
-        ;; thus would like `hide-ifdef-expand-reinclusion-protection' to be 
nil.
-        (setq-local hide-ifdef-expand-reinclusion-protection
-                    (default-value 'hide-ifdef-expand-reinclusion-protection))
+        ;; thus would like `hide-ifdef-expand-reinclusion-guard' to be nil.
+        (setq-local hide-ifdef-expand-reinclusion-guard
+                    (default-value 'hide-ifdef-expand-reinclusion-guard))
         (setq-local hide-ifdef-hiding
                     (default-value 'hide-ifdef-hiding))
         (setq-local hif-outside-read-only buffer-read-only)
@@ -330,23 +361,42 @@ Several variables affect how the hiding is done:
 (defun hif-clear-all-ifdef-defined ()
   "Clears all symbols defined in `hide-ifdef-env'.
 It will backup this variable to `hide-ifdef-env-backup' before clearing to
-prevent accidental clearance."
+prevent accidental clearance.
+When prefixed, it swaps current symbols with the backup ones."
   (interactive)
-  (when (y-or-n-p "Clear all #defined symbols? ")
-    (setq hide-ifdef-env-backup hide-ifdef-env)
-    (setq hide-ifdef-env nil)))
-
-(defun hif-show-all ()
-  "Show all of the text in the current buffer."
-  (interactive)
-  (hif-show-ifdef-region (point-min) (point-max)))
+  (if current-prefix-arg
+      (if hide-ifdef-env-backup
+          (when (y-or-n-p (format
+                           "Restore all %d #defined symbols just cleared? "
+                           (length hide-ifdef-env-backup)))
+            (let ((tmp hide-ifdef-env-backup))
+              (setq hide-ifdef-env hide-ifdef-env-backup)
+              (setq hide-ifdef-env-backup tmp))
+            (message "Backup symbols restored."))
+        (message "No backup symbol to restore."))
+    (when (y-or-n-p (format "Clear all %d #defined symbols? "
+                            (length hide-ifdef-env)))
+      (if hide-ifdef-env ;; backup only if not empty
+          (setq hide-ifdef-env-backup hide-ifdef-env))
+      (setq hide-ifdef-env nil)
+      (message "All defined symbols cleared." ))))
+
+(defun hif-show-all (&optional start end)
+  "Show all of the text in the current buffer.
+If there is a marked region from START to END it only shows the symbols 
within."
+  (interactive
+   (if (use-region-p)
+       (list (region-beginning) (region-end))
+     (list (point-min) (point-max))))
+  (hif-show-ifdef-region
+   (or start (point-min)) (or end (point-max))))
 
 ;; By putting this on after-revert-hook, we arrange that it only
 ;; does anything when revert-buffer avoids turning off the mode.
 ;; (That can happen in VC.)
 (defun hif-after-revert-function ()
   (and hide-ifdef-mode hide-ifdef-hiding
-       (hide-ifdefs t)))
+       (hide-ifdefs nil nil t)))
 (add-hook 'after-revert-hook 'hif-after-revert-function)
 
 (defun hif-end-of-line ()
@@ -427,9 +477,17 @@ Everything including these lines is made invisible."
 
 ;;===%%SF%% evaluation (Start)  ===
 
+(defun hif-eval (form)
+  "Evaluate hideif internal representation."
+  (let ((val (eval form)))
+    (if (stringp val)
+        (or (get-text-property 0 'hif-value val)
+            val)
+      val)))
+
 ;; It is not useful to set this to anything but `eval'.
 ;; In fact, the variable might as well be eliminated.
-(defvar hide-ifdef-evaluator 'eval
+(defvar hide-ifdef-evaluator #'hif-eval
   "The function to use to evaluate a form.
 The evaluator is given a canonical form and returns t if text under
 that form should be displayed.")
@@ -442,23 +500,42 @@ that form should be displayed.")
   "Prepend (VAR VALUE) pair to `hide-ifdef-env'."
   (setq hide-ifdef-env (cons (cons var value) hide-ifdef-env)))
 
+(defconst hif-predefine-alist
+  '((__LINE__         . hif-__LINE__)
+    (__FILE__         . hif-__FILE__)
+    (__COUNTER__      . hif-__COUNTER__)
+    (__cplusplus      . hif-__cplusplus)
+    (__DATE__         . hif-__DATE__)
+    (__TIME__         . hif-__TIME__)
+    (__STDC__         . hif-__STDC__)
+    (__STDC_VERSION__ . hif-__STDC_VERSION__)
+    (__STDC_HOST__    . hif-__STDC_HOST__)
+    (__BASE_FILE__    . hif-__FILE__)))
+
 (declare-function semantic-c-hideif-lookup  "semantic/bovine/c" (var))
 (declare-function semantic-c-hideif-defined "semantic/bovine/c" (var))
 
 (defun hif-lookup (var)
   (or (when (bound-and-true-p semantic-c-takeover-hideif)
         (semantic-c-hideif-lookup var))
-      (let ((val (assoc var hide-ifdef-env)))
+      (let ((val (assq var hide-ifdef-env)))
         (if val
             (cdr val)
-          hif-undefined-symbol))))
+          (if (setq val (assq var hif-predefine-alist))
+              (funcall (cdr val))
+            hif-undefined-symbol)))))
 
 (defun hif-defined (var)
-  (cond
-   ((bound-and-true-p semantic-c-takeover-hideif)
-    (semantic-c-hideif-defined var))
-   ((assoc var hide-ifdef-env) 1)
-   (t 0)))
+  (let (def)
+    (cond
+     ((bound-and-true-p semantic-c-takeover-hideif)
+      (semantic-c-hideif-defined var))
+     ;; Here we can't use hif-lookup as an empty definition like `#define 
EMPTY'
+     ;; is considered defined but is evaluated as `nil'.
+     ((assq var hide-ifdef-env) 1)
+     ((and (setq def (assq var hif-predefine-alist))
+           (funcall (cdr def))) 1)
+     (t 0))))
 
 ;;===%%SF%% evaluation (End)  ===
 
@@ -484,7 +561,7 @@ that form should be displayed.")
 (defconst hif-define-regexp   (concat hif-cpp-prefix "\\(define\\|undef\\)"))
 (defconst hif-id-regexp       (concat "[[:alpha:]_][[:alnum:]_]*"))
 (defconst hif-macroref-regexp
-  (concat hif-white-regexp "\\(" hif-id-regexp "\\)" hif-white-regexp
+  (concat hif-white-regexp "\\(" hif-id-regexp "\\)"
           "\\("
           "(" hif-white-regexp
           "\\(" hif-id-regexp "\\)?" hif-white-regexp
@@ -493,6 +570,75 @@ that form should be displayed.")
           ")"
           "\\)?" ))
 
+;; The point here is *NOT* to do "syntax error checking" for C(++) compiler, 
but
+;; to parse and recognize *already valid* numeric literals.  Therefore we don't
+;; need to worry if number like "0x12'" is invalid, leave it to the compiler.
+;; Otherwise, the runtime performance of hideif would be poor.
+;;
+;; GCC fixed-point literal extension:
+;;
+;; ‘ullk’ or ‘ULLK’ for unsigned long long _Accum and _Sat unsigned long long 
_Accum
+;; ‘ullr’ or ‘ULLR’ for unsigned long long _Fract and _Sat unsigned long long 
_Fract
+;;
+;; ‘llk’ or ‘LLK’ for long long _Accum and _Sat long long _Accum
+;; ‘llr’ or ‘LLR’ for long long _Fract and _Sat long long _Fract
+;; ‘uhk’ or ‘UHK’ for unsigned short _Accum and _Sat unsigned short _Accum
+;; ‘ulk’ or ‘ULK’ for unsigned long _Accum and _Sat unsigned long _Accum
+;; ‘uhr’ or ‘UHR’ for unsigned short _Fract and _Sat unsigned short _Fract
+;; ‘ulr’ or ‘ULR’ for unsigned long _Fract and _Sat unsigned long _Fract
+;;
+;; ‘lk’ or ‘LK’ for long _Accum and _Sat long _Accum
+;; ‘lr’ or ‘LR’ for long _Fract and _Sat long _Fract
+;; ‘uk’ or ‘UK’ for unsigned _Accum and _Sat unsigned _Accum
+;; ‘ur’ or ‘UR’ for unsigned _Fract and _Sat unsigned _Fract
+;; ‘hk’ or ‘HK’ for short _Accum and _Sat short _Accum
+;; ‘hr’ or ‘HR’ for short _Fract and _Sat short _Fract
+;;
+;; ‘r’ or ‘R’ for _Fract and _Sat _Fract
+;; ‘k’ or ‘K’ for _Accum and _Sat _Accum
+
+;; C++14 also include '0b' for binary and "'" as separator
+(defconst hif-numtype-suffix-regexp
+  ;;  
"\\(ll[uU]\\|LL[uU]\\|[uU]?ll\\|[uU]?LL\\|[lL][uU]\\|[uU][lL]\\|[uUlLfF]\\)"
+  (concat
+   "\\(\\(ll[uU]\\|LL[uU]\\|[uU]?ll\\|[uU]?LL\\|[lL][uU]\\|[uU][lL]\\|"
+   "[uU][hH]\\)[kKrR]?\\|" ; GCC fixed-point extension
+   "[dD][dDfFlL]\\|"       ; GCC floating-point extension
+   "[uUlLfF]\\)"))
+(defconst hif-bin-regexp
+  (concat "[+-]?0[bB]\\([01']+\\)"
+          hif-numtype-suffix-regexp "?"))
+(defconst hif-hex-regexp
+  (concat "[+-]?0[xX]\\([[:xdigit:]']+\\)"
+          hif-numtype-suffix-regexp "?"))
+(defconst hif-oct-regexp
+  (concat "[+-]?0[0-7']+"
+          hif-numtype-suffix-regexp "?"))
+(defconst hif-dec-regexp
+  (concat "[+-]?\\(0\\|[1-9][0-9']*\\)"
+          hif-numtype-suffix-regexp "?"))
+
+(defconst hif-decfloat-regexp
+  ;; `hif-string-to-decfloat' relies on the number and ordering of parentheses
+  (concat
+   "\\(?:"
+   "\\([+-]?[0-9]+\\)\\([eE][+-]?[0-9]+\\)?[dD]?[fFlL]?"
+   "\\|\\([+-]?[0-9]+\\)\\.\\([eE][+-]?[0-9]+\\)?[dD]?[dDfFlL]?"
+   "\\|\\([+-]?[0-9]*\\.[0-9]+\\)\\([eE][+-]?[0-9]+\\)?[dD]?[dDfFlL]?"
+   "\\)"))
+
+;; C++17 hexadecimal floating point literal
+(defconst hif-hexfloat-regexp
+  ;; `hif-string-to-hexfloat' relies on the ordering of regexp groupings
+  (concat
+   "[+-]?\\(?:"
+   "0[xX]\\([[:xdigit:]']+\\)[pP]\\([+-]?[0-9']+\\)[fFlL]?"
+   "\\|"
+   "0[xX]\\([[:xdigit:]']+\\)\\.[pP]\\([+-]?[0-9']+\\)[fFlL]?"
+   "\\|"
+   
"0[xX]\\([[:xdigit:]']*\\)\\.\\([[:xdigit:]']+\\)[pP]\\([+-]?[0-9']+\\)[fFlL]?"
+   "\\)"))
+
 ;; Store the current token and the whole token list during parsing.
 ;; Bound dynamically.
 (defvar hif-token)
@@ -530,29 +676,113 @@ that form should be displayed.")
     (":"   . hif-colon)
     (","   . hif-comma)
     ("#"   . hif-stringify)
-    ("..." . hif-etc)))
+    ("..." . hif-etc)
+    ("defined" . hif-defined)))
 
 (defconst hif-valid-token-list (mapcar 'cdr hif-token-alist))
 
 (defconst hif-token-regexp
-  (concat (regexp-opt (mapcar 'car hif-token-alist))
-          "\\|0x[[:xdigit:]]+\\.?[[:xdigit:]]*"
-          "\\|[0-9]+\\.?[0-9]*"  ;; decimal/octal
-          "\\|\\w+"))
-
-(defconst hif-string-literal-regexp  "\\(\"\\(?:[^\"\\]\\|\\\\.\\)*\"\\)")
+  ;; The ordering of regexp grouping is crutial to `hif-strtok'
+  (concat
+   ;; hex/binary:
+   
"\\([+-]?0[xXbB]\\([[:xdigit:]']+\\)?\\.?\\([[:xdigit:]']+\\)?\\([pP]\\([+-]?[0-9]+\\)\\)?"
+   hif-numtype-suffix-regexp "?\\)"
+   ;; decimal/octal:
+   "\\|\\(\\([+-]?[0-9']+\\(\\.[0-9']*\\)?\\)\\([eE][+-]?[0-9]+\\)?"
+   hif-numtype-suffix-regexp "?\\)"
+   "\\|" (regexp-opt (mapcar 'car hif-token-alist) t)
+   "\\|\\(\\w+\\)"))
+
+;; C++11 Unicode string literals (L"" u8"" u"" U"" R"" LR"" u8R"" uR"")
+(defconst hif-unicode-prefix-regexp  "\\(?:u8R?\\|[uUL]R?\\|R\\)")
+(defconst hif-string-literal-regexp
+  (concat hif-unicode-prefix-regexp "?"
+          "\\(\"\\(?:[^\"\\]\\|\\\\.\\)*\"\\)"))
+
+;; matching and conversion
+
+(defun hif-full-match (regexp string)
+  "A full REGEXP match of STRING instead of partially match."
+  (string-match (concat "\\`" regexp "\\'") string))
+
+(defun hif-is-number (string)
+  "Check if STRING is a valid C(++) numeric literal."
+  (or (hif-full-match hif-dec-regexp string)
+      (hif-full-match hif-hex-regexp string)
+      (hif-full-match hif-oct-regexp string)
+      (hif-full-match hif-bin-regexp string)))
+
+(defun hif-is-float (string)
+  "Check if STRING is a valid C(++) floating point literal."
+  (or (hif-full-match hif-decfloat-regexp string)
+      (hif-full-match hif-hexfloat-regexp string)))
+
+(defun hif-delete-char-in-string (char string)
+  "Delete CHAR in STRING inplace."
+  (let ((i (length string))
+        (s nil))
+    (while (> i 0)
+      (setq i (1- i))
+      (unless (eq (aref string i) char)
+        (setq s (cons (aref string i) s))))
+    (concat s)))
+
+(defun hif-string-to-decfloat (string &optional fix exp)
+  "Convert a C(++) decimal floating formatted string into float.
+Assuming we've just regexp-matched with `hif-decfloat-regexp' and it matched.
+if REMATCH is t, do a rematch."
+  ;; In elisp `(string-to-number "01.e2")' will return 1 instead of the 
expected
+  ;; 100.0; therefore we need to write our own.
+  ;; This function relies on the regexp groups of `hif-dexfloat-regexp'
+  (if (or fix exp)
+      (setq fix (hif-delete-char-in-string ?' fix)
+            exp (hif-delete-char-in-string ?' exp))
+    ;; rematch
+    (setq string (hif-delete-char-in-string ?' string))
+    (hif-full-match hif-decfloat-regexp string)
+    (setq fix (or (match-string 1 string)
+                  (match-string 3 string)
+                  (match-string 5 string))
+          exp (or (match-string 2 string)
+                  (match-string 4 string)
+                  (match-string 6 string))))
+  (setq fix (string-to-number fix)
+        exp (if (zerop (length exp)) ;; nil or ""
+                0 (string-to-number (substring-no-properties exp 1))))
+  (* fix (expt 10 exp)))
+
+(defun hif-string-to-hexfloat (string &optional int fra exp)
+  "Convert a C++17 hex float formatted string into float.
+Assuming we've just regexp-matched with `hif-hexfloat-regexp' and it matched.
+if REMATCH is t, do a rematch."
+  ;; This function relies on the regexp groups of `hif-hexfloat-regexp'
+  (let ((negate (if (eq ?- (aref string 0)) -1.0 1.0)))
+    (if (or int fra exp)
+        (setq int (hif-delete-char-in-string ?' int)
+              fra (hif-delete-char-in-string ?' fra)
+              exp (hif-delete-char-in-string ?' exp))
+      (setq string (hif-delete-char-in-string ?' string))
+      (hif-full-match hif-hexfloat-regexp string)
+      (setq int (or (match-string 1 string)
+                    (match-string 3 string)
+                    (match-string 5 string))
+            fra (or (match-string 2 string)
+                    (match-string 4 string)
+                    (match-string 6 string))
+            exp (match-string 7 string)))
+    (setq int (if (zerop (length int)) ;; nil or ""
+                  0 (string-to-number int 16))
+          fra (if (zerop (length fra))
+                  0 (/ (string-to-number fra 16)
+                       (expt 16.0 (length fra))))
+          exp (if (zerop (length exp))
+                  0 (string-to-number exp)))
+    (* negate (+ int fra) (expt 2.0 exp))))
 
 (defun hif-string-to-number (string &optional base)
-  "Like `string-to-number', but it understands non-decimal floats."
-  (if (or (not base) (= base 10))
-      (string-to-number string base)
-    (let* ((parts (split-string string "\\." t "[ \t]+"))
-           (frac (cadr parts))
-           (fraclen (length frac))
-           (quot (expt (if (zerop fraclen)
-                           base
-                           (* base 1.0)) fraclen)))
-      (/ (string-to-number (concat (car parts) frac) base) quot))))
+  "Like `string-to-number', but it understands C(++) literals."
+  (setq string (hif-delete-char-in-string ?' string))
+  (string-to-number string base))
 
 ;; The dynamic binding variable `hif-simple-token-only' is shared only by
 ;; `hif-tokenize' and `hif-find-define'. The purpose is to prevent 
`hif-tokenize'
@@ -562,52 +792,204 @@ that form should be displayed.")
 ;; Check the long comments before `hif-find-define' for more details. [lukelee]
 (defvar hif-simple-token-only)
 
+(defsubst hif-is-white (c)
+  (memq c '(?  ?\t ?\n ?\r)))
+
+(defun hif-strtok (string &optional rematch)
+  "Convert STRING into a hideif mode internal token.
+Assuming we've just performed a `hif-token-regexp' lookup."
+  ;; This function relies on the regexp groups of `hif-token-regexp'
+  ;; New hideif internal number representation: a text string with `hif-value'
+  ;; property to keep its value. Strings without `hif-value' property is a
+  ;; normal C(++) string.  This is mainly for stringification.  The original
+  ;; implementation only keep the value thus a C++ number like octal 01234
+  ;; will become "668" after being stringified instead of the expected "01234".
+  (let (bufstr m1 m3 m5 m6 m8 neg ch val dec)
+    (when rematch
+      (string-match hif-token-regexp string)
+      (setq bufstr string))
+
+    (cond
+
+     ;; decimal/octal
+     ((match-string 8 bufstr)
+      (setq m6 (match-string 9 bufstr))
+      (setq val
+            (if (or (setq m8 (match-string 11 bufstr))
+                    (match-string 10 bufstr)) ;; floating
+                ;; TODO: do we need to add 'hif-type property for
+                ;; type-checking, but this will slow things down
+                (hif-string-to-decfloat string m6 m8)
+              (setq ch (aref string 0))
+              (hif-string-to-number
+               string
+               ;; octal begin with `0'
+               (if (and (> (length string) 1)
+                        (or (eq ch ?0)
+                            ;; -0... or +0...
+                            (and (memq ch '(?- ?+))
+                                 (eq (aref string 1) ?0))))
+                   8 (setq dec 10)))))
+      ;; Decimal integer without sign and extension is identical to its
+      ;; string form, make it as simple as possible
+      (if (and dec
+               (null (match-string 12 bufstr)) ;; no extension like 'UL'
+               (not (memq ch '(?- ?+))))
+          val
+        (add-text-properties 0 1 (list 'hif-value val) string)
+        string))
+
+     ;; hex/binary
+     ((match-string 1 bufstr)
+      (setq m3 (match-string 3 bufstr))
+      (add-text-properties
+       0 1
+       (list 'hif-value
+             (if (or (setq m5 (match-string 5 bufstr))
+                     m3)
+                 (hif-string-to-hexfloat
+                  string
+                  (match-string 2 bufstr) m3 m5) ;; hexfloat
+               (setq neg (if (eq (aref string 0) ?-) -1 1))
+               (* neg
+                  (hif-string-to-number
+                   ;; (5-(-1))/2=3; (5-1)/2=2
+                   (substring-no-properties string (ash (- 5 neg) -1))
+                   ;; (3-(-1))/2=2; (3-1)/2=1
+                   (if (or (eq (setq ch (aref string (ash (- 3 neg) -1))) ?x)
+                           (eq ch ?X)) ;; hex
+                       16 2)))))
+       string) string)
+
+     ;; operator
+     ((setq m1 (match-string 14 bufstr))
+      (cdr (assoc m1 hif-token-alist #'string-equal)))
+
+     (t
+      (setq hif-simple-token-only nil)
+      (intern-safe string)))))
+
+(defun hif-backward-comment (&optional start end)
+  "If we're currently within a C(++) comment, skip them backwards."
+  ;; Ignore trailing white spaces after comment
+  (setq end (or end (point)))
+  (while (and (> (1- end) 1)
+              (hif-is-white (char-after (1- end))))
+     (cl-decf end))
+  (let ((p0 end)
+        p cmt ce ws we ;; ce:comment start, ws:white start, we whilte end
+        cmtlist) ;; pair of (start.end) of comments
+    (setq start (or start (progn (beginning-of-line) (point)))
+          p start)
+    (while (< (1+ p) end)
+      (if (char-equal ?/ (char-after p)) ; /
+          (if (char-equal ?/ (char-after (1+ p))) ; //
+              (progn
+                ;; merge whites immediately ahead
+                (setq ce (if (and we (= (1- p) we)) ws p))
+                ;; scan for end of line
+                (while (and (< (cl-incf p) end)
+                            (not (char-equal ?\n (char-after p)))
+                            (not (char-equal ?\r (char-after p)))))
+                ;; Merge with previous comment if immediately followed
+                (push (cons (if (and cmtlist
+                                     (= (cdr (car cmtlist)) ce))
+                                (car (pop cmtlist)) ;; extend previous comment
+                              ce)
+                            p)
+                      cmtlist))
+            (when (char-equal ?* (char-after (1+ p))) ; /*
+              ;; merge whites immediately ahead
+              (setq ce (if (and we (= (1- p) we)) ws p))
+              ;; Check if it immediately follows previous /*...*/ comment;
+              ;; if yes, extend and merge into previous comment
+              (setq cmt (if (and cmtlist
+                                 (= (cdr (car cmtlist)) ce))
+                            (car (pop cmtlist)) ;; extend previous comment
+                          ce))
+              (setq p (+ 2 p))
+              ;; Scanning for `*/'
+              (catch 'break
+                (while (< (1+ p) end)
+                  (if (not (and (char-equal ?* (char-after p))
+                                (char-equal ?/ (char-after (1+ p)))))
+                      (cl-incf p)
+                    ;; found `*/', mark end pos
+                    (push (cons cmt (1+ (setq p (1+ p)))) cmtlist)
+                    (throw 'break nil)))
+                ;; (1+ p) >= end
+                (push (cons cmt end) cmtlist))))
+        ;; Trace most recent continuous white spaces before a comment
+        (if (char-equal ?  (char-after p))
+            (if (and ws (= we (1- p))) ;; continued
+                (setq we p)
+              (setq ws p
+                    we p))
+          (setq ws nil
+                we nil)))
+      (cl-incf p))
+    ;; Goto beginning of the last comment, if we're within
+    (setq cmt (car cmtlist)) ;; last cmt
+    (setq cmt (if (and cmt
+                       (>= p0 (car cmt))
+                       (<= p0 (cdr cmt)))
+                  (car cmt) ;; beginning of the last comment
+                p0))
+    ;; Ignore leading whites ahead of comment
+    (while (and (> (1- cmt) 1)
+                (hif-is-white (char-after (1- cmt))))
+       (cl-decf cmt))
+    (goto-char cmt)))
+
 (defun hif-tokenize (start end)
   "Separate string between START and END into a list of tokens."
-  (let ((token-list nil))
+  (let ((token-list nil)
+        (white-regexp "[ \t]+")
+        token)
     (setq hif-simple-token-only t)
     (with-syntax-table hide-ifdef-syntax-table
       (save-excursion
-        (goto-char start)
-        (while (progn (forward-comment (point-max)) (< (point) end))
-          ;; (message "expr-start = %d" expr-start) (sit-for 1)
-          (cond
-           ((looking-at "\\\\\n")
-            (forward-char 2))
-
-           ((looking-at hif-string-literal-regexp)
-            (push (substring-no-properties (match-string 1)) token-list)
-            (goto-char (match-end 0)))
-
-           ((looking-at hif-token-regexp)
-            (let ((token (buffer-substring-no-properties
-                          (point) (match-end 0))))
+        (save-restriction
+          ;; Narrow down to the focusing region so that the ending white spaces
+          ;; of that line will not be treated as a white, as `looking-at' won't
+          ;; look outside the restriction; otherwise it will note the last 
token
+          ;; or string as one with an `hif-space' property.
+          (setq end (hif-backward-comment start end))
+          (narrow-to-region start end)
+          (goto-char start)
+          (while (progn (forward-comment (point-max)) (< (point) end))
+            ;; (message "expr-start = %d" expr-start) (sit-for 1)
+            (cond
+             ((looking-at "\\\\\n")
+              (forward-char 2))
+
+             ((looking-at hif-string-literal-regexp)
+              (setq token (substring-no-properties (match-string 1)))
+              (goto-char (match-end 0))
+              (when (looking-at white-regexp)
+                (add-text-properties 0 1 '(hif-space t) token)
+                (goto-char (match-end 0)))
+              (push token token-list))
+
+             ((looking-at hif-token-regexp)
               (goto-char (match-end 0))
-              ;; (message "token: %s" token) (sit-for 1)
-              (push
-               (or (cdr (assoc token hif-token-alist))
-                   (if (string-equal token "defined") 'hif-defined)
-                   ;; TODO:
-                   ;; 1. postfix 'l', 'll', 'ul' and 'ull'
-                   ;; 2. floating number formats (like 1.23e4)
-                   ;; 3. 098 is interpreted as octal conversion error
-                   (if (string-match "0x\\([[:xdigit:]]+\\.?[[:xdigit:]]*\\)"
-                                     token)
-                       (hif-string-to-number (match-string 1 token) 16)) ;; hex
-                   (if (string-match "\\`0[0-9]+\\(\\.[0-9]+\\)?\\'" token)
-                       (hif-string-to-number token 8)) ;; octal
-                   (if (string-match "\\`[1-9][0-9]*\\(\\.[0-9]+\\)?\\'"
-                                     token)
-                       (string-to-number token)) ;; decimal
-                   (prog1 (intern token)
-                     (setq hif-simple-token-only nil)))
-               token-list)))
-
-           ((looking-at "\r") ; Sometimes MS-Windows user will leave CR in
-            (forward-char 1)) ;  the source code. Let's not get stuck here.
-           (t (error "Bad #if expression: %s" (buffer-string)))))))
-
-    (nreverse token-list)))
+              (setq token (hif-strtok
+                           (substring-no-properties (match-string 0))))
+              (push token token-list)
+              (when (looking-at white-regexp)
+                ;; We can't just append a space to the token string, otherwise
+                ;; `0xf0 ' ## `01' will become `0xf0 01' instead of the 
expected
+                ;; `0xf001', hence a standalone `hif-space' is placed instead.
+                (push 'hif-space token-list)
+                (goto-char (match-end 0))))
+
+             ((looking-at "\r") ; Sometimes MS-Windows user will leave CR in
+              (forward-char 1)) ;  the source code. Let's not get stuck here.
+
+             (t (error "Bad #if expression: %s" (buffer-string)))))))
+      (if (eq 'hif-space (car token-list))
+          (setq token-list (cdr token-list))) ;; remove trailing white space
+      (nreverse token-list))))
 
 ;;------------------------------------------------------------------------
 ;; Translate C preprocessor #if expressions using recursive descent.
@@ -637,50 +1019,96 @@ that form should be displayed.")
 ;;  |                      | ^= =                        |               |
 ;;  | Comma                | ,                           | left-to-right |
 
-(defsubst hif-nexttoken ()
+(defun hif-nexttoken (&optional keep-space)
   "Pop the next token from token-list into the let variable `hif-token'."
-  (setq hif-token (pop hif-token-list)))
+  (let ((prevtoken hif-token))
+    (while (progn
+             (setq hif-token (pop hif-token-list))
+             (if keep-space ; keep only one space
+                 (and (eq prevtoken 'hif-space)
+                      (eq hif-token 'hif-space))
+               (eq hif-token 'hif-space)))))
+  hif-token)
+
+(defun hif-split-signed-token ()
+  "Split current numeric token into two (hif-plus/minus num)."
+  (let* (val ch0 head)
+    (when (and (stringp hif-token)
+               (setq val (get-text-property 0 'hif-value hif-token))
+               ;; explicitly signed?
+               (memq (setq ch0 (aref hif-token 0)) '(?+ ?-)))
+      (if (eq ch0 ?+)
+          (setq head 'hif-plus)
+        (setq head 'hif-minus
+              val (- val)))
+      (setq hif-token (substring hif-token 1))
+      (add-text-properties 0 1 (list 'hif-value val) hif-token)
+      (push hif-token hif-token-list)
+      (setq hif-token head))))
 
 (defsubst hif-if-valid-identifier-p (id)
   (not (or (numberp id)
-           (stringp id))))
+           (stringp id)
+           (and (atom id)
+                (eq 'defined id)))))
 
 (defun hif-define-operator (tokens)
   "\"Upgrade\" hif-define XXX to `(hif-define XXX)' so it won't be 
substituted."
-  (let ((result nil)
-        (tok nil))
-    (while (setq tok (pop tokens))
-      (push
-       (if (eq tok 'hif-defined)
-           (progn
-             (setq tok (cadr tokens))
-             (if (eq (car tokens) 'hif-lparen)
-                 (if (and (hif-if-valid-identifier-p tok)
-                          (eq (nth 2 tokens) 'hif-rparen))
-                     (setq tokens (cl-cdddr tokens))
-                   (error "#define followed by non-identifier: %S" tok))
-               (setq tok (car tokens)
-                     tokens (cdr tokens))
-               (unless (hif-if-valid-identifier-p tok)
-                 (error "#define followed by non-identifier: %S" tok)))
-             (list 'hif-defined 'hif-lparen tok 'hif-rparen))
-         tok)
-       result))
-    (nreverse result)))
+  (if (memq 'hif-defined tokens)
+      (let* ((hif-token-list tokens)
+             hif-token
+             target
+             paren)
+        (setq tokens nil) ;; now it becomes the result
+        (while (hif-nexttoken t) ;; keep `hif-space'
+          (when (eq hif-token 'hif-defined)
+            ;; defined XXX, start ignoring `hif-space'
+            (hif-nexttoken)
+            (if (setq paren (eq hif-token 'hif-lparen))
+                (hif-nexttoken))
+            (if (not (hif-if-valid-identifier-p
+                      (setq target hif-token)))
+                (error "`defined' followed by non-identifier: %S" target))
+            (if (and paren
+                     (not (eq (hif-nexttoken) 'hif-rparen)))
+                (error "missing right parenthesis for `defined'"))
+            (setq hif-token
+                  (list 'hif-defined 'hif-lparen target 'hif-rparen)))
+          (push hif-token tokens))
+        (nreverse tokens))
+    tokens))
 
 (define-obsolete-function-alias 'hif-flatten #'flatten-tree "27.1")
 
-(defun hif-expand-token-list (tokens &optional macroname expand_list)
+(defun hif-keep-single (l e)
+  "Prevent two or more consecutive E in list L."
+  (if (memq e l)
+      (let (prev curr result)
+        (while (progn
+                 (setq prev curr
+                       curr (car l)
+                       l (cdr l))
+                 curr)
+          (unless (and (eq prev e)
+                       (eq curr e))
+            (push curr result)))
+        (nreverse result))
+    l))
+
+(defun hif-expand-token-list (tokens &optional macroname expand_list level)
   "Perform expansion on TOKENS till everything expanded.
 Self-reference (directly or indirectly) tokens are not expanded.
 EXPAND_LIST is the list of macro names currently being expanded, used for
-detecting self-reference."
+detecting self-reference.
+Function-like macros with calling depth LEVEL 0 does not expand arguments,
+this is to emulate the stringification behavior of C++ preprocessor."
   (catch 'self-referencing
     (let ((expanded nil)
           (remains (hif-define-operator
                     (hif-token-concatenation
                      (hif-token-stringification tokens))))
           tok rep)
+      (setq level (if level level 0))
       (if macroname
           (setq expand_list (cons macroname expand_list)))
       ;; Expanding all tokens till list exhausted
@@ -699,21 +1127,31 @@ detecting self-reference."
            (if (and (listp rep)
                     (eq (car rep) 'hif-define-macro)) ; A defined macro
                ;; Recursively expand it
+               ;; only in defined macro do we increase the nesting LEVEL
                (if (cadr rep) ; Argument list is not nil
-                   (if (not (eq (car remains) 'hif-lparen))
+                   (if (not (or (eq (car remains) 'hif-lparen)
+                                ;; hif-space hif-lparen
+                                (and (eq (car remains) 'hif-space)
+                                     (eq (cadr remains) 'hif-lparen)
+                                     (setq remains (cdr remains)))))
                        ;; No argument, no invocation
                        tok
                      ;; Argumented macro, get arguments and invoke it.
-                     ;; Dynamically bind hif-token-list and hif-token
-                     ;; for hif-macro-supply-arguments
+                     ;; Dynamically bind `hif-token-list' and `hif-token'
+                     ;; for `hif-macro-supply-arguments'
                      (let* ((hif-token-list (cdr remains))
                             (hif-token nil)
-                            (parmlist (mapcar #'hif-expand-token-list
-                                              (hif-get-argument-list)))
+                            (parmlist
+                             (if (zerop level)
+                                 (hif-get-argument-list t)
+                               (mapcar (lambda (a)
+                                         (hif-expand-token-list
+                                          a nil nil (1+ level)))
+                                       (hif-get-argument-list t))))
                             (result
                              (hif-expand-token-list
                               (hif-macro-supply-arguments tok parmlist)
-                              tok expand_list)))
+                              tok expand_list (1+ level))))
                        (setq remains (cons hif-token hif-token-list))
                        result))
                  ;; Argument list is nil, direct expansion
@@ -745,16 +1183,20 @@ detecting self-reference."
   "Parse the TOKEN-LIST.
 Return translated list in prefix form.  MACRONAME is applied when invoking
 macros to prevent self-reference."
-  (let ((hif-token-list (hif-expand-token-list token-list macroname)))
+  (let ((hif-token-list (hif-expand-token-list token-list macroname nil))
+        (hif-token nil))
     (hif-nexttoken)
     (prog1
         (and hif-token
              (hif-exprlist))
       (if hif-token ; is there still a token?
-          (error "Error: unexpected token: %s" hif-token)))))
+          (error "Error: unexpected token at line %d: `%s'"
+                 (line-number-at-pos)
+                 (or (car (rassq hif-token hif-token-alist))
+                     hif-token))))))
 
 (defun hif-exprlist ()
-  "Parse an exprlist: expr { `,' expr}."
+  "Parse an exprlist: expr { `,' expr }."
   (let ((result (hif-expr)))
     (if (eq hif-token 'hif-comma)
         (let ((temp (list result)))
@@ -824,7 +1266,7 @@ expr : or-expr | or-expr `?' expr `:' expr."
 (defun hif-eq-expr ()
   "Parse an eq-expr : comp | eq-expr `=='|`!=' comp."
   (let ((result (hif-comp-expr))
-       (eq-token nil))
+        (eq-token nil))
     (while (memq hif-token '(hif-equal hif-notequal))
       (setq eq-token hif-token)
       (hif-nexttoken)
@@ -857,7 +1299,9 @@ expr : or-expr | or-expr `?' expr `:' expr."
        math : muldiv | math `+'|`-' muldiv."
   (let ((result (hif-muldiv-expr))
         (math-op nil))
-    (while (memq hif-token '(hif-plus hif-minus))
+    (while (or (memq hif-token '(hif-plus hif-minus))
+               ;; One token lookahead
+               (hif-split-signed-token))
       (setq math-op hif-token)
       (hif-nexttoken)
       (setq result (list math-op result (hif-muldiv-expr))))
@@ -876,7 +1320,7 @@ expr : or-expr | or-expr `?' expr `:' expr."
 
 (defun hif-factor ()
   "Parse a factor.
-factor : `!' factor | `~' factor | `(' expr `)' | `defined(' id `)' |
+factor : `!' factor | `~' factor | `(' exprlist `)' | `defined(' id `)' |
          id `(' parmlist `)' | strings | id."
   (cond
    ((eq hif-token 'hif-not)
@@ -908,10 +1352,14 @@ factor : `!' factor | `~' factor | `(' expr `)' | 
`defined(' id `)' |
       (hif-nexttoken)
       `(hif-defined (quote ,ident))))
 
+   ((stringp hif-token)
+    (if (get-text-property 0 'hif-value hif-token)
+        ;; new hideif internal number format for string concatenation
+        (prog1 hif-token (hif-nexttoken))
+      (hif-string-concatenation)))
+
    ((numberp hif-token)
     (prog1 hif-token (hif-nexttoken)))
-   ((stringp hif-token)
-    (hif-string-concatenation))
 
    ;; Unary plus/minus.
    ((memq hif-token '(hif-minus hif-plus))
@@ -924,12 +1372,12 @@ factor : `!' factor | `~' factor | `(' expr `)' | 
`defined(' id `)' |
           (hif-place-macro-invocation ident)
         `(hif-lookup (quote ,ident)))))))
 
-(defun hif-get-argument-list ()
+(defun hif-get-argument-list (&optional keep-space)
   (let ((nest 0)
         (parmlist nil) ; A "token" list of parameters, will later be parsed
         (parm nil))
 
-    (while (or (not (eq (hif-nexttoken) 'hif-rparen))
+    (while (or (not (eq (hif-nexttoken keep-space) 'hif-rparen))
                (/= nest 0))
       (if (eq (car (last parm)) 'hif-comma)
           (setq parm nil))
@@ -945,7 +1393,7 @@ factor : `!' factor | `~' factor | `(' expr `)' | 
`defined(' id `)' |
       (push hif-token parm))
 
     (push (nreverse parm) parmlist) ; Okay even if PARM is nil
-    (hif-nexttoken) ; Drop the `hif-rparen', get next token
+    (hif-nexttoken keep-space) ; Drop the `hif-rparen', get next token
     (nreverse parmlist)))
 
 (defun hif-place-macro-invocation (ident)
@@ -973,10 +1421,21 @@ This macro cannot be evaluated alone without parameters 
input."
   (cond
    ((numberp a)
     (number-to-string a))
-   ((atom a)
-    (symbol-name a))
    ((stringp a)
-    (concat "\"" a "\""))
+    ;; Remove properties here otherwise a string like "0x12 + 0x34" will be
+    ;; later evaluated as (0x12 + 0x34) and become 0x70.
+    ;; See also `hif-eval' and `hif-mathify'.
+    (concat (substring-no-properties a)
+            (if (get-text-property 0 'hif-space a) " ")))
+   ((atom a)
+    (if (memq a hif-valid-token-list)
+        (car (rassq a hif-token-alist))
+      (if (eq a 'hif-space)
+          " "
+        (symbol-name a))))
+   ((listp a)  ;; stringify each element then concat
+    (cl-loop for e in a
+             concat (hif-stringify e)))
    (t
     (error "Invalid token to stringify"))))
 
@@ -984,32 +1443,34 @@ This macro cannot be evaluated alone without parameters 
input."
   (if (stringp str)
       (intern str)))
 
-(defun hif-token-concat (a b)
-  "Concatenate two tokens into a longer token.
-Currently support only simple token concatenation.  Also support weird (but
-valid) token concatenation like `>' ## `>' becomes `>>'.  Here we take care 
only
-those that can be evaluated during preprocessing time and ignore all those that
-can only be evaluated at C(++) runtime (like `++', `--' and `+='...)."
-  (if (or (memq a hif-valid-token-list)
-          (memq b hif-valid-token-list))
-      (let* ((ra (car (rassq a hif-token-alist)))
-             (rb (car (rassq b hif-token-alist)))
-             (result (and ra rb
-                          (cdr (assoc (concat ra rb) hif-token-alist)))))
-        (or result
-            ;;(error "Invalid token to concatenate")
-            (error "Concatenating \"%s\" and \"%s\" does not give a valid \
-preprocessing token"
-                   (or ra (symbol-name a))
-                   (or rb (symbol-name b)))))
-    (intern-safe (concat (hif-stringify a)
-                         (hif-stringify b)))))
+(defun hif-token-concat (l)
+  "Concatenate a list of tokens into a longer token.
+Also support weird (but valid) token concatenation like `>' ## `>' becomes 
`>>'.
+Here we take care only those that can be evaluated during preprocessing time 
and
+ignore all those that can only be evaluated at C(++) runtime (like `++', `--'
+and `+='...)."
+  (let ((str nil))
+    (dolist (i l)
+      ;;(assert (not (eq i 'hif-space)) nil ;; debug
+      ;;        "Internal error: should not be concatenating `hif-space'")
+      (setq str
+            (concat str
+                    (if (memq i hif-valid-token-list)
+                        (car (rassq i hif-token-alist))
+                      (hif-stringify i)))))
+    ;; Check if it's a number, if yes, return the number instead of a symbol.
+    ;; 'hif-value and 'hif-space properties are trimmed off by `hif-stringify'
+    (hif-strtok str t)))
 
 (defun hif-mathify (val)
-  "Treat VAL as a number: if it's t or nil, use 1 or 0."
-  (cond ((eq val t) 1)
-       ((null val) 0)
-       (t val)))
+  "Treat VAL as a hideif number: if it's t or nil, use 1 or 0."
+  (cond
+   ((stringp val)
+    (or (get-text-property 0 'hif-value val)
+        val))
+   ((eq val t) 1)
+   ((null val) 0)
+   (t val)))
 
 (defun hif-conditional (a b c)
   (if (not (zerop (hif-mathify a))) (hif-mathify b) (hif-mathify c)))
@@ -1053,49 +1514,108 @@ preprocessing token"
 (defalias 'hif-logxor        (hif-mathify-binop logxor))
 (defalias 'hif-logand        (hif-mathify-binop logand))
 
+(defun hif-__LINE__ ()
+  (line-number-at-pos))
+
+(defun hif-__FILE__ ()
+  (file-name-nondirectory (buffer-file-name)))
+
+(defvar hif-__COUNTER__ 0)
+(defun hif-__COUNTER__ ()
+  (prog1 hif-__COUNTER__ (cl-incf hif-__COUNTER__)))
+
+(defun hif-__cplusplus ()
+  (and (string-match
+        "\\.c\\(c\\|xx\\|pp\\|\\+\\+\\)\\'"
+        (buffer-file-name))
+       (memq major-mode '(c++-mode cc-mode cpp-mode))
+       201710))
+
+(defun hif-__DATE__ ()
+  (format-time-string "%Y/%m/%d"))
+
+(defun hif-__TIME__ ()
+  (format-time-string "%H:%M:%S"))
+
+(defun hif-__STDC__ ()         1)
+(defun hif-__STDC_VERSION__ () 201710)
+(defun hif-__STDC_HOST__ ()    1)
 
 (defun hif-comma (&rest expr)
   "Evaluate a list of EXPR, return the result of the last item."
   (let ((result nil))
-    (dolist (e expr)
+    (dolist (e expr result)
       (ignore-errors
-        (setq result (funcall hide-ifdef-evaluator e))))
-    result))
+        (setq result (funcall hide-ifdef-evaluator e))))))
 
 (defun hif-token-stringification (l)
-  "Scan token list for `hif-stringify' ('#') token and stringify the next 
token."
-  (let (result)
-    (while l
-      (push (if (eq (car l) 'hif-stringify)
-                (prog1
-                    (if (cadr l)
-                        (hif-stringify (cadr l))
-                      (error "No token to stringify"))
-                  (setq l (cdr l)))
-              (car l))
-            result)
-      (setq l (cdr l)))
-    (nreverse result)))
+  "Scan token list for `hif-stringify' (`#') token and stringify the next 
token."
+  (if (memq 'hif-stringify l)
+      (let (result)
+        (while l
+          (push (if (eq (car l) 'hif-stringify)
+                    (prog1
+                        (if (cadr l)
+                            (hif-stringify (cadr l))
+                          (error "No token to stringify"))
+                      (setq l (cdr l)))
+                  (car l))
+                result)
+          (setq l (cdr l)))
+        (nreverse result))
+    ;; no `#' presents
+    l))
 
 (defun hif-token-concatenation (l)
-  "Scan token list for `hif-token-concat' ('##') token and concatenate two 
tokens."
-  (let ((prev nil)
-        result)
-    (while l
-      (while (eq (car l) 'hif-token-concat)
-        (unless prev
-          (error "No token before ## to concatenate"))
-        (unless (cdr l)
-          (error "No token after ## to concatenate"))
-        (setq prev (hif-token-concat prev (cadr l)))
-        (setq l (cddr l)))
-      (if prev
-          (setq result (append result (list prev))))
-      (setq prev (car l)
-            l (cdr l)))
-    (if prev
-        (append result (list prev))
-      result)))
+  "Scan token list for `hif-token-concat' ('##') token and concatenate tokens."
+  (if (memq 'hif-token-concat l)
+      ;; Notice that after some substitutions, there could be more than
+      ;; one `hif-space' in a list.
+      (let ((items nil)
+            (tk nil)
+            (count 0) ; count of `##'
+            result)
+        (setq l (hif-keep-single l 'hif-space))
+        (while (setq tk (car l))
+          (if (not (eq tk 'hif-token-concat))
+              ;; In reverse order so that we don't have to use `last' or
+              ;; `butlast'
+              (progn
+                (push tk result)
+                (setq l (cdr l)))
+            ;; First `##' met, start `##' sequence
+            ;; We only drop `hif-space' when doing token concatenation
+            (setq items nil
+                  count 0)
+            (setq tk (pop result))
+            (if (or (null tk)
+                    (and (eq tk 'hif-space)
+                         (null (setq tk (pop result)))))
+                (error "No token before `##' to concatenate")
+              (push tk items) ; first item, in reverse order
+              (setq tk 'hif-token-concat))
+            (while (eq tk 'hif-token-concat)
+              (cl-incf count)
+              ;; 2+ item
+              (setq l (cdr l)
+                    tk (car l))
+              ;; only one 'hif-space could appear here
+              (if (eq tk 'hif-space) ; ignore it
+                  (setq l (cdr l)
+                        tk (car l)))
+              (if (or (null tk)
+                      (eq tk 'hif-token-concat))
+                  (error
+                   "No token after the %d-th `##' to concatenate at line %d"
+                   count (line-number-at-pos))
+                (push tk items)
+                (setq l (cdr l)
+                      tk (car l))))
+            ;; `##' sequence ended, concat them, then push into result
+            (push (hif-token-concat (nreverse items)) result)))
+        (nreverse result))
+    ;; no need to reassemble the list if no `##' presents
+    l))
 
 (defun hif-delimit (lis atom)
   (nconc (mapcan (lambda (l) (list l atom))
@@ -1105,7 +1625,7 @@ preprocessing token"
 ;; Perform token replacement:
 (defun hif-macro-supply-arguments (macro-name actual-parms)
   "Expand a macro call, replace ACTUAL-PARMS in the macro body."
-  (let* ((SA                   (assoc macro-name hide-ifdef-env))
+  (let* ((SA                   (assq macro-name hide-ifdef-env))
          (macro                (and SA
                                     (cdr SA)
                                     (eq (cadr SA) 'hif-define-macro)
@@ -1156,11 +1676,14 @@ preprocessing token"
                              formal macro-body))
         (setq actual-parms (cdr actual-parms)))
 
-      ;; Replacement completed, flatten the whole token list
-      (setq macro-body (flatten-tree macro-body))
+        ;; Replacement completed, stringifiy and concatenate the token list.
+        ;; Stringification happens must take place before flattening, otherwise
+        ;; only the first token will be stringified.
+        (setq macro-body
+              (flatten-tree (hif-token-stringification macro-body)))
 
-      ;; Stringification and token concatenation happens here
-      (hif-token-concatenation (hif-token-stringification macro-body)))))
+        ;; Token concatenation happens here, keep single 'hif-space
+        (hif-keep-single (hif-token-concatenation macro-body) 'hif-space))))
 
 (defun hif-invoke (macro-name actual-parms)
   "Invoke a macro by expanding it, reparse macro-body and finally invoke it."
@@ -1432,7 +1955,7 @@ Point is left unchanged."
 ;; A bit slimy.
 
 (defun hif-hide-line (point)
-  "Hide the line containing point.
+  "Hide the line containing POINT.
 Does nothing if `hide-ifdef-lines' is nil."
   (when hide-ifdef-lines
     (save-excursion
@@ -1441,7 +1964,7 @@ Does nothing if `hide-ifdef-lines' is nil."
        (line-beginning-position) (progn (hif-end-of-line) (point))))))
 
 
-;;  Hif-Possibly-Hide
+;;  hif-Possibly-Hide
 ;;  There are four cases.  The #ifX expression is "taken" if it
 ;;  the hide-ifdef-evaluator returns T.  Presumably, this means the code
 ;;  inside the #ifdef would be included when the program was
@@ -1484,7 +2007,7 @@ Does nothing if `hide-ifdef-lines' is nil."
   "Called at #ifX expression, this hides those parts that should be hidden.
 It uses the judgment of `hide-ifdef-evaluator'.  EXPAND-REINCLUSION is a flag
 indicating that we should expand the #ifdef even if it should be hidden.
-Refer to `hide-ifdef-expand-reinclusion-protection' for more details."
+Refer to `hide-ifdef-expand-reinclusion-guard' for more details."
   ;; (message "hif-possibly-hide") (sit-for 1)
   (let* ((case-fold-search nil)
          (test (hif-canonicalize hif-ifx-regexp))
@@ -1564,23 +2087,83 @@ Refer to `hide-ifdef-expand-reinclusion-protection' for 
more details."
          (result (funcall hide-ifdef-evaluator expr)))
     result))
 
+(defun hif-display-macro (name def &optional result)
+  (if (and def
+           (listp def)
+           (eq (car def) 'hif-define-macro))
+      (let ((cdef (concat "#define " name))
+            (parmlist (cadr def))
+            s)
+        (setq def (caddr def))
+        ;; parmlist
+        (when parmlist
+          (setq cdef (concat cdef "("))
+          (while (car parmlist)
+            (setq cdef (concat cdef (symbol-name (car parmlist))
+                               (if (cdr parmlist) ","))
+                  parmlist (cdr parmlist)))
+          (setq cdef (concat cdef ")")))
+        (setq cdef (concat cdef " "))
+        ;; body
+        (while def
+          (if (listp def)
+              (setq s (car def)
+                    def (cdr def))
+            (setq s def
+                  def nil))
+          (setq cdef
+                (concat cdef
+                        (cond
+                         ;;((setq tok (car (rassoc s hif-token-alist)))
+                         ;; (concat tok (if (eq s 'hif-comma) " ")))
+                         ((symbolp s)
+                          (concat (hif-stringify s)
+                                  (if (eq s 'hif-comma) " ")))
+                         ((stringp s)
+                          (hif-stringify s))
+                         (t ;; (numberp s)
+                          (format "%S" s))))))
+        (if (and result
+                 ;; eg: "#define RECURSIVE_SYMBOL RECURSIVE_SYMBOL"
+                 (not (and (listp result)
+                           (eq (car result) 'hif-define-macro))))
+            (setq cdef (concat cdef
+                               (if (integerp result)
+                                   (format "\n=> %S (%#x)" result result)
+                                 (format "\n=> %S" result)))))
+        (message "%s" cdef))
+    (message "%S <= `%s'" def name)))
+
 (defun hif-evaluate-macro (rstart rend)
   "Evaluate the macro expansion result for the active region.
-If no region active, find the current #ifdefs and evaluate the result.
+If no region is currently active, find the current #ifdef/#define and evaluate
+the result; otherwise it looks for current word at point.
 Currently it supports only math calculations, strings or argumented macros can
-not be expanded."
+not be expanded.
+This function by default ignores parsing error and return `false' on evaluating
+runtime C(++) statements or tokens that normal C(++) preprocessor can't 
perform;
+however, when this command is prefixed, it will display the error instead."
   (interactive
-   (if (use-region-p)
-       (list (region-beginning) (region-end))
-     '(nil nil)))
-  (let ((case-fold-search nil))
+   (if (not (use-region-p))
+       '(nil nil)
+     (list (region-beginning) (region-end))))
+  (run-hooks 'hide-ifdef-evalulate-enter-hook)
+  (let ((case-fold-search nil)
+        (currpnt (point))
+        bounds)
     (save-excursion
       (unless (use-region-p)
         (setq rstart nil rend nil)
         (beginning-of-line)
-        (when (and (re-search-forward hif-macro-expr-prefix-regexp nil t)
-                   (string= "define" (match-string 2)))
-          (re-search-forward hif-macroref-regexp nil t)))
+        (if (and (re-search-forward hif-macro-expr-prefix-regexp nil t)
+                 (= (line-number-at-pos currpnt) (line-number-at-pos)))
+            (if (string= "define" (match-string 2))
+                (re-search-forward hif-macroref-regexp nil t))
+          (goto-char currpnt)
+          (setq bounds (bounds-of-thing-at-point 'word)
+                ;; TODO: BOUNDS need a C++ syntax word boundary finder
+                rstart (car bounds)
+                rend   (cdr bounds))))
       (let* ((start (or rstart (point)))
              (end   (or rend (progn (hif-end-of-line) (point))))
              (defined nil)
@@ -1588,34 +2171,61 @@ not be expanded."
              (tokens (ignore-errors ; Prevent C statement things like
                                         ; 'do { ... } while (0)'
                        (hif-tokenize start end)))
+             ;; Note that on evaluating we can't simply define the symbol
+             ;; even if we are currently at a #define line, as this #define
+             ;; might actually be wrapped up in a #if 0 block.  We can only
+             ;; define that explicitly with `hide-ifdef-define'.
              (expr (or (and (<= (length tokens) 1) ; Simple token
-                            (setq defined (assoc (car tokens) hide-ifdef-env))
+                            (setq defined
+                                  (or (assq (car tokens) hide-ifdef-env)
+                                      (assq (car tokens) hif-predefine-alist)))
                             (setq simple (atom (hif-lookup (car tokens))))
                             (hif-lookup (car tokens)))
                        (and tokens
-                            (condition-case nil
+                            (condition-case err
                                 (hif-parse-exp tokens)
                               (error
-                               nil)))))
-             (result (funcall hide-ifdef-evaluator expr))
-             (exprstring (replace-regexp-in-string
-                          ;; Trim off leading/trailing whites
-                          "^[ \t]*\\|[ \t]*$"  ""
-                          (replace-regexp-in-string
-                           "\\(//.*\\)" "" ; Trim off end-of-line comments
-                           (buffer-substring-no-properties start end)))))
-        (cond
-         ((and (<= (length tokens) 1) simple) ; Simple token
-          (if defined
-              (message "%S <= `%s'" result exprstring)
-            (message "`%s' is not defined" exprstring)))
-         ((integerp result)
-          (if (or (= 0 result) (= 1 result))
-              (message "%S <= `%s'" result exprstring)
-            (message "%S (%#x) <= `%s'" result result exprstring)))
-         ((null result) (message "%S <= `%s'" 'false exprstring))
-         ((eq t result) (message "%S <= `%s'" 'true exprstring))
-         (t (message "%S <= `%s'" result exprstring)))
+                               ;; when prefixed, pass the error on for later
+                               ;; `hide-ifdef-evaluator'
+                               (if current-prefix-arg err))))))
+             (exprstring (hif-stringify tokens))
+             (result (condition-case err
+                         (funcall hide-ifdef-evaluator expr)
+                       ;; in case of arithmetic error or others
+                       (error (error "Error: line %d %S when evaluating `%s'"
+                                     (line-number-at-pos) err exprstring)))))
+        (setq
+         result
+         (cond
+          ((= (length tokens) 0)
+           (message "`%s'" exprstring))
+          ((= (length tokens) 1) ; Simple token
+           (if simple
+               (if defined
+                   (hif-display-macro exprstring result)
+                 (if (and (hif-is-number exprstring)
+                          result (numberp result))
+                     (message "%S (%#x)" result result)
+                   (if (and (hif-is-float exprstring)
+                            result (numberp result))
+                       (message "%S (%s)" result exprstring)
+                     (if (string-match hif-string-literal-regexp exprstring)
+                         (message "%s" exprstring)
+                       (message "`%s' is not defined" exprstring)))))
+             (if defined
+                 (hif-display-macro exprstring (cdr defined) result)
+               (message "`%s' is not defined" exprstring))))
+          ((integerp result)
+           (if (or (= 0 result) (= 1 result))
+               (message "%S <= `%s'" result exprstring)
+             (message "%S (%#x) <= `%s'" result result exprstring)))
+          ((null result)
+           (message "%S <= `%s'" 'false exprstring))
+          ((eq t result)
+           (message "%S <= `%s'" 'true exprstring))
+          (t
+           (message "%S <= `%s'" result exprstring))))
+        (run-hooks 'hide-ifdef-evalulate-leave-hook)
         result))))
 
 (defun hif-parse-macro-arglist (str)
@@ -1667,6 +2277,8 @@ first arg will be `hif-etc'."
 ;; the performance I use this `hif-simple-token-only' to notify my code and
 ;; save the final [value] into symbol database. [lukelee]
 
+(defvar hif-verbose-define-count 0)
+
 (defun hif-find-define (&optional min max)
   "Parse texts and retrieve all defines within the region MIN and MAX."
   (interactive)
@@ -1676,8 +2288,11 @@ first arg will be `hif-etc'."
         (let* ((defining (string= "define" (match-string 2)))
                (name (and (re-search-forward hif-macroref-regexp max t)
                           (match-string 1)))
-               (parmlist (and (match-string 3) ; First arg id found
-                              (hif-parse-macro-arglist (match-string 2)))))
+               (parmlist (or (and (match-string 3) ; First arg id found
+                                  (delq 'hif-space
+                                   (hif-parse-macro-arglist (match-string 2))))
+                             (and (match-string 2) ; empty arglist
+                                  (list nil)))))
           (if defining
               ;; Ignore name (still need to return 't), or define the name
               (or (and hide-ifdef-exclude-define-regexp
@@ -1689,6 +2304,14 @@ first arg will be `hif-etc'."
                          (hif-simple-token-only nil) ; Dynamic binding
                          (tokens
                           (and name
+                               (prog1 t
+                                 (cl-incf hif-verbose-define-count)
+                                 ;; only show 1/50 to not slow down to much
+                                 (if (and hide-ifdef-verbose
+                                          (= (% hif-verbose-define-count 50) 
1))
+                                     (message "[Line %d] defining %S"
+                                              (line-number-at-pos (point))
+                                              (substring-no-properties name))))
                                ;; `hif-simple-token-only' is set/clear
                                ;; only in this block
                                (condition-case nil
@@ -1700,8 +2323,10 @@ first arg will be `hif-etc'."
                                   ;; this will stop hideif from searching
                                   ;; for more #defines.
                                   (setq hif-simple-token-only t)
-                                  (buffer-substring-no-properties
-                                   start end)))))
+                                  (replace-regexp-in-string
+                                   "^[ \t]*\\|[ \t]*$"  ""
+                                   (buffer-substring-no-properties
+                                    start end))))))
                          ;; For simple tokens we save only the parsed result;
                          ;; otherwise we save the tokens and parse it after
                          ;; parameter replacement
@@ -1715,17 +2340,19 @@ first arg will be `hif-etc'."
                                         `(hif-define-macro ,parmlist
                                                            ,tokens))))
                          (SA (and name
-                                  (assoc (intern name) hide-ifdef-env))))
+                                  (assq (intern name) hide-ifdef-env))))
                     (and name
                          (if SA
                              (or (setcdr SA expr) t)
-                           ;; Lazy evaluation, eval only if hif-lookup find it.
+                           ;; Lazy evaluation, eval only if `hif-lookup' find 
it.
                            ;; Define it anyway, even if nil it's still in list
                            ;; and therefore considered defined.
                            (push (cons (intern name) expr) hide-ifdef-env)))))
             ;; #undef
             (and name
-                 (hif-undefine-symbol (intern name))))))
+                 (intern-soft name)
+                 (hif-undefine-symbol (intern name)))
+            t)))
        t))
 
 
@@ -1735,7 +2362,10 @@ first arg will be `hif-etc'."
   (save-excursion
     (save-restriction
       ;; (mark-region min max) ;; for debugging
+      (setq hif-verbose-define-count 0)
+      (forward-comment (point-max))
       (while (hif-find-define min max)
+        (forward-comment (point-max))
         (setf min (point)))
       (if max (goto-char max)
         (goto-char (point-max))))))
@@ -1745,22 +2375,31 @@ first arg will be `hif-etc'."
 It does not do the work that's pointless to redo on a recursive entry."
   (save-excursion
     (let* ((case-fold-search t) ; Ignore case for `hide-ifdef-header-regexp'
-           (expand-header (and hide-ifdef-expand-reinclusion-protection
+           (expand-header (and hide-ifdef-expand-reinclusion-guard
                                (buffer-file-name)
                                (string-match hide-ifdef-header-regexp
                                              (buffer-file-name))
                                (zerop hif-recurse-level)))
            (case-fold-search nil)
            min max)
+      (setq hif-__COUNTER__ 0)
       (goto-char (point-min))
       (setf min (point))
-      (cl-loop do
-               (setf max (hif-find-any-ifX))
-               (hif-add-new-defines min max)
-               (if max
-                   (hif-possibly-hide expand-header))
-               (setf min (point))
-               while max))))
+      ;; Without this `condition-case' it would be easier to see which
+      ;; operation went wrong thru the backtrace `iff' user realize
+      ;; the underlying meaning of all hif-* operation; for example,
+      ;; `hif-shiftleft' refers to C(++) '<<' operator and floating
+      ;; operation arguments would be invalid.
+      (condition-case err
+          (cl-loop do
+                   (setf max (hif-find-any-ifX))
+                   (hif-add-new-defines min max)
+                   (if max
+                       (hif-possibly-hide expand-header))
+                   (setf min (point))
+                   while max)
+        (error (error "Error: failed at line %d %S"
+                      (line-number-at-pos) err))))))
 
 ;;===%%SF%% hide-ifdef-hiding (End)  ===
 
@@ -1821,13 +2460,17 @@ This allows #ifdef VAR to be hidden."
                                      nil nil t nil "1")))
      (list var val)))
   (hif-set-var var (or val 1))
-  (message "%s set to %s" var (or val 1))
-  (sleep-for 1)
-  (if hide-ifdef-hiding (hide-ifdefs)))
+  (if hide-ifdef-hiding (hide-ifdefs))
+  (message "%s set to %s" var (or val 1)))
 
 (defun hif-undefine-symbol (var)
-  (setq hide-ifdef-env
-        (delete (assoc var hide-ifdef-env) hide-ifdef-env)))
+  (when (assq var hide-ifdef-env)
+    (setq hide-ifdef-env
+          (delete (assq var hide-ifdef-env) hide-ifdef-env))
+    ;; We can override things in `hif-predefine-alist' so keep them
+    (unless (assq var hif-predefine-alist)
+      (unintern (symbol-name var) nil))
+    t))
 
 (defun hide-ifdef-undef (start end)
   "Undefine a VAR so that #ifdef VAR would not be included."
@@ -1848,35 +2491,54 @@ This allows #ifdef VAR to be hidden."
       (if hide-ifdef-hiding (hide-ifdefs))
       (message "`%S' undefined" sym))))
 
-(defun hide-ifdefs (&optional nomsg)
+(defun hide-ifdefs (&optional start end nomsg)
   "Hide the contents of some #ifdefs.
 Assume that defined symbols have been added to `hide-ifdef-env'.
 The text hidden is the text that would not be included by the C
 preprocessor if it were given the file with those symbols defined.
 With prefix command presents it will also hide the #ifdefs themselves.
 
+Hiding will only be performed within the marked region if there is one.
+
 Turn off hiding by calling `show-ifdefs'."
 
-  (interactive)
-  (let ((hide-ifdef-lines current-prefix-arg))
-    (or nomsg
-        (message "Hiding..."))
-    (setq hif-outside-read-only buffer-read-only)
-    (unless hide-ifdef-mode (hide-ifdef-mode 1)) ; Turn on hide-ifdef-mode
-    (if hide-ifdef-hiding
-        (show-ifdefs))                    ; Otherwise, deep confusion.
-    (setq hide-ifdef-hiding t)
-    (hide-ifdef-guts)
-    (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))
-    (or nomsg
-        (message "Hiding done"))))
-
-
-(defun show-ifdefs ()
+  (interactive
+   (if (use-region-p)
+       (list (region-beginning) (region-end))
+     (list (point-min) (point-max))))
+
+  (setq current-prefix-arg (or hide-ifdef-lines current-prefix-arg))
+  (save-restriction
+    (let* ((hide-ifdef-lines current-prefix-arg)
+           (outer-hide-ifdef-verbose hide-ifdef-verbose)
+           (hide-ifdef-verbose (and outer-hide-ifdef-verbose
+                                    (not (or nomsg (use-region-p)))))
+           (hide-start-time (current-time)))
+      (and hide-ifdef-verbose
+           (message "Hiding..."))
+      (setq hif-outside-read-only buffer-read-only)
+      (unless hide-ifdef-mode (hide-ifdef-mode 1)) ; Turn on hide-ifdef-mode
+      (if hide-ifdef-hiding
+          (show-ifdefs))                    ; Otherwise, deep confusion.
+      (setq hide-ifdef-hiding t)
+      (narrow-to-region (or start (point-min)) (or end (point-max)))
+      (hide-ifdef-guts)
+      (setq buffer-read-only
+            (or hide-ifdef-read-only hif-outside-read-only))
+      (and hide-ifdef-verbose
+           (message "Hiding done, %.1f seconds elapsed"
+                    (float-time (time-subtract (current-time)
+                                               hide-start-time)))))))
+
+
+(defun show-ifdefs (&optional start end)
   "Cancel the effects of `hide-ifdef': show the contents of all #ifdefs."
-  (interactive)
+  (interactive
+   (if (use-region-p)
+       (list (region-beginning) (region-end))
+     (list (point-min) (point-max))))
   (setq buffer-read-only hif-outside-read-only)
-  (hif-show-all)
+  (hif-show-all (or start (point-min)) (or end (point-max)))
   (setq hide-ifdef-hiding nil))
 
 
@@ -1960,21 +2622,17 @@ With optional prefix argument ARG, also hide the 
#ifdefs themselves."
 
 
 ;;;  definition alist support
+;; The old implementation that match symbol only to 't is now considered
+;; obsolete.
 
 (defvar hide-ifdef-define-alist nil
   "A global assoc list of pre-defined symbol lists.")
 
-(defun hif-compress-define-list (env)
-  "Compress the define list ENV into a list of defined symbols only."
-  (let ((new-defs nil))
-    (dolist (def env new-defs)
-      (if (hif-lookup (car def)) (push (car def) new-defs)))))
-
 (defun hide-ifdef-set-define-alist (name)
   "Set the association for NAME to `hide-ifdef-env'."
   (interactive "SSet define list: ")
-  (push (cons name (hif-compress-define-list hide-ifdef-env))
-       hide-ifdef-define-alist))
+  (push (cons name hide-ifdef-env)
+        hide-ifdef-define-alist))
 
 (defun hide-ifdef-use-define-alist (name)
   "Set `hide-ifdef-env' to the define list specified by NAME."
@@ -1986,9 +2644,8 @@ With optional prefix argument ARG, also hide the #ifdefs 
themselves."
   (if (stringp name) (setq name (intern name)))
   (let ((define-list (assoc name hide-ifdef-define-alist)))
     (if define-list
-       (setq hide-ifdef-env
-             (mapcar (lambda (arg) (cons arg t))
-                     (cdr define-list)))
+        (setq hide-ifdef-env
+              (cdr define-list))
       (error "No define list for %s" name))
     (if hide-ifdef-hiding (hide-ifdefs))))
 
diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el
index 81ba0d8..b255758 100644
--- a/lisp/progmodes/hideshow.el
+++ b/lisp/progmodes/hideshow.el
@@ -310,7 +310,7 @@ a block), `hs-hide-all', `hs-hide-block' and 
`hs-hide-level'.")
 These commands include the toggling commands (when the result is to show
 a block), `hs-show-all' and `hs-show-block'.")
 
-(defvar hs-set-up-overlay #'ignore
+(defcustom hs-set-up-overlay #'ignore
   "Function called with one arg, OV, a newly initialized overlay.
 Hideshow puts a unique overlay on each range of text to be hidden
 in the buffer.  Here is a simple example of how to use this variable:
@@ -326,7 +326,9 @@ in the buffer.  Here is a simple example of how to use this 
variable:
 
 This example shows how to get information from the overlay as well
 as how to set its `display' property.  See `hs-make-overlay' and
-info node `(elisp)Overlays'.")
+info node `(elisp)Overlays'."
+  :type 'function
+  :version "28.1")
 
 ;;---------------------------------------------------------------------------
 ;; internal variables
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index a942235..c2481f6 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -1060,7 +1060,7 @@ Return the pitem of the function we went to the beginning 
of."
             (t
              (js--beginning-of-defun-nested))))))
 
-(defun js--flush-caches (&optional beg ignored)
+(defun js--flush-caches (&optional beg _ignored)
   "Flush the `js-mode' syntax cache after position BEG.
 BEG defaults to `point-min', meaning to flush the entire cache."
   (interactive)
@@ -1340,7 +1340,6 @@ LIMIT defaults to point."
 
 (defun js--end-of-defun-nested ()
   "Helper function for `js-end-of-defun'."
-  (message "test")
   (let* (pitem
          (this-end (save-excursion
                      (and (setq pitem (js--beginning-of-defun-nested))
@@ -1474,11 +1473,10 @@ LIMIT defaults to point."
   "Helper function for building `js--font-lock-keywords'.
 Create a byte-compiled function for matching a concatenation of
 REGEXPS, but only if FRAMEWORK is in `js-enabled-frameworks'."
-  (setq regexps (apply #'concat regexps))
-  (byte-compile
-   `(lambda (limit)
-      (when (memq (quote ,framework) js-enabled-frameworks)
-        (re-search-forward ,regexps limit t)))))
+  (let ((regexp (apply #'concat regexps)))
+    (lambda (limit)
+      (when (memq framework js-enabled-frameworks)
+        (re-search-forward regexp limit t)))))
 
 (defvar-local js--tmp-location nil)
 
@@ -2862,7 +2860,11 @@ return nil."
           ((nth 3 parse-status) 0) ; inside string
           ((when (and js-jsx-syntax (not js-jsx--indent-col))
              (save-excursion (js-jsx--indentation parse-status))))
-          ((eq (char-after) ?#) 0)
+          ((and (eq (char-after) ?#)
+                (save-excursion
+                  (forward-char 1)
+                  (looking-at-p cpp-font-lock-keywords-source-directives)))
+           0)
           ((save-excursion (js--beginning-of-macro)) 4)
           ;; Indent array comprehension continuation lines specially.
           ((let ((bracket (nth 1 parse-status))
@@ -4178,8 +4180,9 @@ browser, respectively."
                        "style" "")
                      cmds)))
 
-             (eval (list 'with-js
-                         (cons 'js-list (nreverse cmds))))))
+             (eval `(with-js
+                        (js-list ,@(nreverse cmds)))
+                   t)))
 
           (command-hook
            ()
diff --git a/lisp/progmodes/modula2.el b/lisp/progmodes/modula2.el
index 2a0374a..a8d644d 100644
--- a/lisp/progmodes/modula2.el
+++ b/lisp/progmodes/modula2.el
@@ -201,7 +201,10 @@
          ((zerop (length tok))
           (let ((forward-sexp-function nil))
             (condition-case nil
-                (forward-sexp -1)
+                (let ((p (point)))
+                  (forward-sexp -1)
+                  (when (= p (point))
+                    (setq res ":")))
               (scan-error (setq res ":")))))
          ((member tok '("|" "OF" "..")) (setq res ":-case"))
          ((member tok '(":" "END" ";" "BEGIN" "VAR" "RECORD" "PROCEDURE"))
diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el
index a1a5192..aff3066 100644
--- a/lisp/progmodes/octave.el
+++ b/lisp/progmodes/octave.el
@@ -460,7 +460,8 @@ Non-nil means always go to the next Octave code line after 
sending."
          (smie-rule-parent octave-block-offset)
        ;; For (invalid) code between switch and case.
        ;; (if (smie-rule-parent-p "switch") 4)
-       nil))))
+       nil))
+    ('(:after . "=") (smie-rule-parent octave-block-offset))))
 
 (defun octave-indent-comment ()
   "A function for `smie-indent-functions' (which see)."
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index fd23683..f49ee4c 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -285,7 +285,7 @@
              (put-text-property (match-beginning 2) (match-end 2)
                                 'syntax-table (string-to-syntax "\""))
              (perl-syntax-propertize-special-constructs end)))))
-      ("\\(^\\|[?:.,;=!~({[ 
\t]\\)\\([msy]\\|q[qxrw]?\\|tr\\)\\>\\s-*\\(?:\\([^])}>= 
\n\t]\\)\\|\\(?3:=\\)[^>]\\)"
+      ("\\(^\\|[?:.,;=|&!~({[ 
\t]\\|=>\\)\\([msy]\\|q[qxrw]?\\|tr\\)\\>\\(?:\\s-\\|\n\\)*\\(?:\\([^])}>= 
\n\t]\\)\\|\\(?3:=\\)[^>]\\)"
        ;; Nasty cases:
        ;; /foo/m  $a->m  $#m $m @m %m
        ;; \s (appears often in regexps).
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 8e025bd..fbdf010 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -319,10 +319,10 @@ The default implementation uses `find-program'."
          ;; expanded and not left for the shell command
          ;; to interpret.
          (localdir (file-name-unquote (file-local-name (expand-file-name 
dir))))
-         (command (format "%s %s %s -type f %s -print0"
+         (command (format "%s -H %s %s -type f %s -print0"
                           find-program
-                          ;; In case DIR is a symlink.
-                          (file-name-as-directory localdir)
+                          (shell-quote-argument
+                           (directory-file-name localdir)) ; Bug#48471
                           (xref--find-ignores-arguments ignores localdir)
                           (if files
                               (concat (shell-quote-argument "(")
@@ -1149,11 +1149,16 @@ current project, it will be killed."
 
 (defun project--buffer-list (pr)
   "Return the list of all buffers in project PR."
-  (let (bufs)
+  (let ((conn (file-remote-p (project-root pr)))
+        bufs)
     (dolist (buf (buffer-list))
-      (when (equal pr
-                   (with-current-buffer buf
-                     (project-current)))
+      ;; For now we go with the assumption that a project must reside
+      ;; entirely on one host.  We might relax that in the future.
+      (when (and (equal conn
+                        (file-remote-p (buffer-local-value 'default-directory 
buf)))
+                 (equal pr
+                        (with-current-buffer buf
+                          (project-current))))
         (push buf bufs)))
     (nreverse bufs)))
 
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 20ec339..f7267bd 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -4239,6 +4239,11 @@ JUSTIFY should be used (if applicable) as in 
`fill-paragraph'."
                     (point)))))
          (num-quotes (python-syntax-count-quotes
                       (char-after str-start-pos) str-start-pos))
+         (str-line-start-pos
+          (save-excursion
+            (goto-char str-start-pos)
+            (beginning-of-line)
+            (point-marker)))
          (str-end-pos
           (save-excursion
             (goto-char (+ str-start-pos num-quotes))
@@ -4262,7 +4267,7 @@ JUSTIFY should be used (if applicable) as in 
`fill-paragraph'."
             ('symmetric (and multi-line-p (cons 1 1)))))
          (fill-paragraph-function))
     (save-restriction
-      (narrow-to-region str-start-pos str-end-pos)
+      (narrow-to-region str-line-start-pos str-end-pos)
       (fill-paragraph justify))
     (save-excursion
       (when (and (python-info-docstring-p) python-fill-docstring-style)
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 3577282..01fb044 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -2127,11 +2127,9 @@ It will be properly highlighted even when the call omits 
parens.")
           "loop"
           "open"
           "p"
-          "print"
           "printf"
           "proc"
           "putc"
-          "puts"
           "require"
           "require_relative"
           "spawn"
@@ -2180,9 +2178,11 @@ It will be properly highlighted even when the call omits 
parens.")
           "fork"
           "global_variables"
           "local_variables"
+          "print"
           "private"
           "protected"
           "public"
+          "puts"
           "raise"
           "rand"
           "readline"
@@ -2421,6 +2421,15 @@ If there is no Rubocop config file, Rubocop will be 
passed a flag
    report-fn
    args))
 
+(defconst ruby--prettify-symbols-alist
+  '(("<=" . ?≤)
+    (">=" . ?≥)
+    ("->"  . ?→)
+    ("=>"  . ?⇒)
+    ("::" . ?∷)
+    ("lambda" . ?λ))
+  "Value for `prettify-symbols-alist' in `ruby-mode'.")
+
 ;;;###autoload
 (define-derived-mode ruby-mode prog-mode "Ruby"
   "Major mode for editing Ruby code."
@@ -2437,6 +2446,7 @@ If there is no Rubocop config file, Rubocop will be 
passed a flag
 
   (setq-local font-lock-defaults '((ruby-font-lock-keywords) nil nil
                                    ((?_ . "w"))))
+  (setq-local prettify-symbols-alist ruby--prettify-symbols-alist)
 
   (setq-local syntax-propertize-function #'ruby-syntax-propertize))
 
diff --git a/lisp/progmodes/scheme.el b/lisp/progmodes/scheme.el
index b697284..57351a7 100644
--- a/lisp/progmodes/scheme.el
+++ b/lisp/progmodes/scheme.el
@@ -299,7 +299,9 @@ See `run-hooks'."
        (concat
         "(" (regexp-opt
              '("begin" "call-with-current-continuation" "call/cc"
-               "call-with-input-file" "call-with-output-file" "case" "cond"
+               "call-with-input-file" "call-with-output-file"
+               "call-with-port"
+               "case" "cond"
                "do" "else" "for-each" "if" "lambda" "λ"
                "let" "let*" "let-syntax" "letrec" "letrec-syntax"
                ;; R6RS library subforms.
@@ -542,6 +544,7 @@ indentation."
 (put 'library 'scheme-indent-function 1) ; R6RS
 
 (put 'call-with-input-file 'scheme-indent-function 1)
+(put 'call-with-port 'scheme-indent-function 1)
 (put 'with-input-from-file 'scheme-indent-function 1)
 (put 'with-input-from-port 'scheme-indent-function 1)
 (put 'call-with-output-file 'scheme-indent-function 1)
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index c6bd32a..c3a12c5 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -1596,6 +1596,8 @@ This adds rules for comments and assignments."
 
 ;;; Completion
 
+(defvar sh--completion-keywords '("if" "while" "until" "for"))
+
 (defun sh--vars-before-point ()
   (save-excursion
     (let ((vars ()))
@@ -1617,7 +1619,7 @@ This adds rules for comments and assignments."
                          (sh--vars-before-point))
                  (locate-file-completion-table
                   exec-path exec-suffixes string pred t)
-                 '("if" "while" "until" "for"))))
+                 sh--completion-keywords)))
     (complete-with-action action cmds string pred)))
 
 (defun sh-completion-at-point-function ()
@@ -1628,9 +1630,17 @@ This adds rules for comments and assignments."
           (start (point)))
       (cond
        ((eq (char-before) ?$)
-        (list start end (sh--vars-before-point)))
+        (list start end (sh--vars-before-point)
+              :company-kind (lambda (_) 'variable)))
        ((sh-smie--keyword-p)
-        (list start end #'sh--cmd-completion-table))))))
+        (list start end #'sh--cmd-completion-table
+              :company-kind
+              (lambda (s)
+                (cond
+                 ((member s sh--completion-keywords) 'keyword)
+                 ((string-suffix-p "=" s) 'variable)
+                 (t 'function)))
+              ))))))
 
 ;;; Indentation and navigation with SMIE.
 
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index 65a4094..f144549 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -484,6 +484,7 @@ file.  Since that is a plaintext file, this could be 
dangerous."
      :prompt-regexp "^[[:alnum:]_]*=[#>] "
      :prompt-length 5
      :prompt-cont-regexp "^[[:alnum:]_]*[-(][#>] "
+     :statement sql-postgres-statement-starters
      :input-filter sql-remove-tabs-filter
      :terminator ("\\(^\\s-*\\\\g\\|;\\)" . "\\g"))
 
@@ -997,20 +998,6 @@ for the first time."
   :version "24.1"
   :type 'hook)
 
-;; Customization for ANSI
-
-(defcustom sql-ansi-statement-starters
-  (regexp-opt '("create" "alter" "drop"
-                "select" "insert" "update" "delete" "merge"
-                "grant" "revoke"))
-  "Regexp of keywords that start SQL commands.
-
-All products share this list; products should define a regexp to
-identify additional keywords in a variable defined by
-the :statement feature."
-  :version "24.1"
-  :type 'regexp)
-
 ;; Customization for Oracle
 
 (defcustom sql-oracle-program "sqlplus"
@@ -1033,12 +1020,6 @@ You will find the file in your Orant\\bin directory."
   :type 'sql-login-params
   :version "24.1")
 
-(defcustom sql-oracle-statement-starters
-  (regexp-opt '("declare" "begin" "with"))
-  "Additional statement starting keywords in Oracle."
-  :version "24.1"
-  :type 'string)
-
 (defcustom sql-oracle-scan-on t
   "Non-nil if placeholders should be replaced in Oracle SQLi.
 
@@ -1502,6 +1483,26 @@ Based on `comint-mode-map'.")
     table)
   "Syntax table used in `sql-mode' and `sql-interactive-mode'.")
 
+;; Motion Function Keywords
+
+(defvar sql-ansi-statement-starters
+  (regexp-opt '("create" "alter" "drop"
+                "select" "insert" "update" "delete" "merge"
+                "grant" "revoke"))
+  "Regexp of keywords that start SQL commands.
+
+All products share this list; products should define a regexp to
+identify additional keywords in a variable defined by
+the :statement feature.")
+
+(defvar sql-oracle-statement-starters
+  (regexp-opt '("declare" "begin" "with"))
+  "Additional statement-starting keywords in Oracle.")
+
+(defvar sql-postgres-statement-starters
+  (regexp-opt '("with"))
+  "Additional statement-starting keywords in Postgres.")
+
 ;; Font lock support
 
 (defvar sql-mode-font-lock-object-name
@@ -3723,8 +3724,7 @@ to avoid deleting non-prompt output."
 
           ;; If we've found all the expected prompts, stop looking
           (if (= sql-output-newline-count 0)
-              (setq sql-output-newline-count nil
-                    oline (concat "\n" oline))
+              (setq sql-output-newline-count nil)
 
             ;; Still more possible prompts, leave them for the next pass
             (setq sql-preoutput-hold oline
@@ -3769,6 +3769,8 @@ to avoid deleting non-prompt output."
            (with-current-buffer sql-buffer
               (when sql-debug-send
                 (message ">>SQL> %S" s))
+              (insert "\n")
+              (comint-set-process-mark)
 
              ;; Send the string (trim the trailing whitespace)
              (sql-input-sender (get-buffer-process (current-buffer)) s)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 7fc7181..b7a926f 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -896,6 +896,44 @@ beginning of the line."
       (xref--search-property 'xref-item))
   (xref-show-location-at-point))
 
+(defcustom xref-truncation-width 400
+  "The column to visually \"truncate\" each Xref buffer line to."
+  :type '(choice
+          (integer :tag "Number of columns")
+          (const :tag "Disable truncation" nil)))
+
+(defun xref--apply-truncation ()
+  (let ((bol (line-beginning-position))
+        (eol (line-end-position))
+        (inhibit-read-only t)
+        pos adjusted-bol)
+    (when (and xref-truncation-width
+               (> (- eol bol) xref-truncation-width)
+               ;; Either truncation not applied yet, or it hides the current
+               ;; position: need to refresh.
+               (or (and (null (get-text-property (1- eol) 'invisible))
+                        (null (get-text-property bol 'invisible)))
+                   (get-text-property (point) 'invisible)))
+      (setq adjusted-bol
+            (cond
+             ((eq (get-text-property bol 'face) 'xref-line-number)
+              (next-single-char-property-change bol 'face))
+             (t bol)))
+      (cond
+       ((< (- (point) bol) xref-truncation-width)
+        (setq pos (+ bol xref-truncation-width))
+        (remove-text-properties bol pos '(invisible))
+        (put-text-property pos eol 'invisible 'ellipsis))
+       ((< (- eol (point)) xref-truncation-width)
+        (setq pos (- eol xref-truncation-width))
+        (remove-text-properties pos eol '(invisible))
+        (put-text-property adjusted-bol pos 'invisible 'ellipsis))
+       (t
+        (setq pos (- (point) (/ xref-truncation-width 2)))
+        (put-text-property adjusted-bol pos 'invisible 'ellipsis)
+        (remove-text-properties pos (+ pos xref-truncation-width) '(invisible))
+        (put-text-property (+ pos xref-truncation-width) eol 'invisible 
'ellipsis))))))
+
 (defun xref--insert-xrefs (xref-alist)
   "Insert XREF-ALIST in the current-buffer.
 XREF-ALIST is of the form ((GROUP . (XREF ...)) ...), where
@@ -939,6 +977,11 @@ GROUP is a string for decoration purposes and XREF is an
                         (setq prev-line line
                               prev-group group))))
            (insert "\n"))
+  (add-to-invisibility-spec '(ellipsis . t))
+  (save-excursion
+    (goto-char (point-min))
+    (while (= 0 (forward-line 1))
+      (xref--apply-truncation)))
   (run-hooks 'xref-after-update-hook))
 
 (defun xref--analyze (xrefs)
@@ -976,6 +1019,7 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
         (buffer-undo-list t))
     (erase-buffer)
     (xref--insert-xrefs xref-alist)
+    (add-hook 'post-command-hook 'xref--apply-truncation nil t)
     (goto-char (point-min))
     (setq xref--original-window (assoc-default 'window alist)
           xref--original-window-intent (assoc-default 'display-action alist))
@@ -1044,6 +1088,12 @@ local keymap that binds `RET' to 
`xref-quit-and-goto-xref'."
 (define-obsolete-function-alias 'xref--show-defs-buffer-at-bottom
   #'xref-show-definitions-buffer-at-bottom "28.1")
 
+(defun xref--completing-read-group (cand transform)
+  "Return group title of candidate CAND or TRANSFORM the candidate."
+  (if transform
+      (substring cand (1+ (next-single-property-change 0 'xref--group cand)))
+    (get-text-property 0 'xref--group cand)))
+
 (defun xref-show-definitions-completing-read (fetcher alist)
   "Let the user choose the target definition with completion.
 
@@ -1072,10 +1122,12 @@ between them by typing in the minibuffer with 
completion."
                                     (format #("%d:" 0 2 (face 
xref-line-number))
                                             line)
                                   ""))
+                               (group-prefix
+                                (substring group group-prefix-length))
                                (group-fmt
-                                (propertize
-                                 (substring group group-prefix-length)
-                                 'face 'xref-file-header))
+                                (propertize group-prefix
+                                            'face 'xref-file-header
+                                            'xref--group group-prefix))
                                (candidate
                                 (format "%s:%s%s" group-fmt line-fmt summary)))
                           (push (cons candidate xref) 
xref-alist-with-line-info)))))
@@ -1087,7 +1139,9 @@ between them by typing in the minibuffer with completion."
                          (lambda (string pred action)
                            (cond
                             ((eq action 'metadata)
-                             '(metadata . ((category . xref-location))))
+                             `(metadata
+                               . ((category . xref-location)
+                                  (group-function . 
,#'xref--completing-read-group))))
                             (t
                              (complete-with-action action collection string 
pred)))))
                         (def (caar collection)))
@@ -1410,7 +1464,7 @@ IGNORES is a list of glob patterns for files to ignore."
        ;; do that reliably enough, without creating false negatives?
        (command (xref--rgrep-command (xref--regexp-to-extended regexp)
                                      files
-                                     (file-name-as-directory
+                                     (directory-file-name
                                       (file-name-unquote
                                        (file-local-name (expand-file-name 
dir))))
                                      ignores))
diff --git a/lisp/ps-mule.el b/lisp/ps-mule.el
index a8b5210..ab8af40 100644
--- a/lisp/ps-mule.el
+++ b/lisp/ps-mule.el
@@ -673,7 +673,7 @@ the sequence."
                        (not (vectorp (aref (nth 2 composition) 0))))
                   (car composition)
                 to))
-        (ascii-or-latin-1 "[\000-\377]+")
+        (ascii-or-latin-1 "[\000-ÿ]+")
         (run-width 0)
         (endpos nil)
         (font-spec-table (aref ps-mule-font-spec-tables
@@ -699,6 +699,7 @@ the sequence."
                 (setq composition (find-composition (point) to nil t))
                 (setq stop (if composition (car composition) to)))))
 
+            ;; We fold lines that contain ASCII or Latin-1.
            ((looking-at ascii-or-latin-1)
             (let ((nchars (- (min (match-end 0) stop) (point))))
               (setq width (* average-width nchars))
@@ -710,6 +711,7 @@ the sequence."
                 (setq run-width (+ run-width width))
                 (forward-char nchars))))
 
+            ;; Don't fold other lines.  (But why?)
            (t
             (while (and (< (point) stop) (not endpos))
               (setq width (char-width (following-char)))
diff --git a/lisp/repeat.el b/lisp/repeat.el
index b7118cc..503cb34 100644
--- a/lisp/repeat.el
+++ b/lisp/repeat.el
@@ -338,10 +338,22 @@ recently executed command not bound to an input event\"."
   "Key that stops the modal repeating of keys in sequence.
 For example, you can set it to <return> like `isearch-exit'."
   :type '(choice (const :tag "No special key to exit repeating sequence" nil)
-                (key-sequence :tag "Key that exits repeating sequence"))
+                 (key-sequence :tag "Key that exits repeating sequence"))
   :group 'convenience
   :version "28.1")
 
+(defcustom repeat-exit-timeout nil
+  "Break the repetition chain of keys after specified timeout.
+When a number, exit the repeat mode after idle time of the specified
+number of seconds."
+  :type '(choice (const :tag "No timeout to exit repeating sequence" nil)
+                 (number :tag "Timeout in seconds to exit repeating"))
+  :group 'convenience
+  :version "28.1")
+
+(defvar repeat-exit-timer nil
+  "Timer activated after the last key typed in the repeating key sequence.")
+
 (defcustom repeat-keep-prefix t
   "Keep the prefix arg of the previous command."
   :type 'boolean
@@ -385,7 +397,7 @@ When Repeat mode is enabled, and the command symbol has the 
property named
                                    (and (commandp s)
                                         (get s 'repeat-map)
                                         (push (get s 'repeat-map) keymaps))))))
-      (message "Repeat mode is enabled for %d commands and %d keymaps"
+      (message "Repeat mode is enabled for %d commands and %d keymaps; see 
`describe-repeat'."
                (length commands)
                (length (delete-dups keymaps))))))
 
@@ -420,16 +432,32 @@ When Repeat mode is enabled, and the command symbol has 
the property named
                 (setq prefix-arg current-prefix-arg))
 
               (setq repeat-in-progress t)
-              (set-transient-map map))))))
+              (let ((exitfun (set-transient-map map)))
+
+                (when repeat-exit-timer
+                  (cancel-timer repeat-exit-timer)
+                  (setq repeat-exit-timer nil))
+
+                (when repeat-exit-timeout
+                  (setq repeat-exit-timer
+                        (run-with-idle-timer
+                         repeat-exit-timeout nil
+                         (lambda ()
+                           (setq repeat-in-progress nil)
+                           (funcall exitfun)
+                           (funcall repeat-echo-function nil)))))))))))
 
     (setq repeat-map nil)
     (when (and was-in-progress (not repeat-in-progress))
+      (when repeat-exit-timer
+        (cancel-timer repeat-exit-timer)
+        (setq repeat-exit-timer nil))
       (funcall repeat-echo-function nil))))
 
-(defun repeat-echo-message-string (map)
+(defun repeat-echo-message-string (keymap)
   "Return a string with a list of repeating keys."
   (let (keys)
-    (map-keymap (lambda (key _) (push key keys)) map)
+    (map-keymap (lambda (key _) (push key keys)) keymap)
     (format-message "Repeat with %s%s"
                     (mapconcat (lambda (key)
                                  (key-description (vector key)))
@@ -439,26 +467,50 @@ When Repeat mode is enabled, and the command symbol has 
the property named
                                 (key-description repeat-exit-key))
                       ""))))
 
-(defun repeat-echo-message (map)
+(defun repeat-echo-message (keymap)
   "Display available repeating keys in the echo area."
-  (when map
-    (let ((mess (repeat-echo-message-string map)))
-      (if (current-message)
-          (message "%s [%s]" (current-message) mess)
-        (message mess)))))
+  (if keymap
+      (let ((mess (repeat-echo-message-string keymap)))
+        (if (current-message)
+            (message "%s [%s]" (current-message) mess)
+          (message mess)))
+    (when (string-prefix-p "Repeat with " (current-message))
+      (message nil))))
 
 (defvar repeat-echo-mode-line-string
   (propertize "[Repeating...] " 'face 'mode-line-emphasis)
   "String displayed in the mode line in repeating mode.")
 
-(defun repeat-echo-mode-line (map)
+(defun repeat-echo-mode-line (keymap)
   "Display the repeat indicator in the mode line."
-  (if map
+  (if keymap
       (unless (assq 'repeat-in-progress mode-line-modes)
         (add-to-list 'mode-line-modes (list 'repeat-in-progress
                                             repeat-echo-mode-line-string)))
     (force-mode-line-update t)))
 
+(defun describe-repeat ()
+  "Describe repeatable commands and keymaps."
+  (interactive)
+  (help-setup-xref (list #'describe-repeat)
+                   (called-interactively-p 'interactive))
+  (let ((keymaps nil))
+    (all-completions
+     "" obarray (lambda (s)
+                  (and (commandp s)
+                       (get s 'repeat-map)
+                       (push s (alist-get (get s 'repeat-map) keymaps)))))
+    (with-help-window (help-buffer)
+      (with-current-buffer standard-output
+        (princ "This is a list of repeatable keymaps and commands.\n\n")
+
+        (dolist (keymap (sort keymaps (lambda (a b) (string-lessp (car a) (car 
b)))))
+          (princ (format-message "`%s' keymap is repeatable by these 
commands:\n"
+                                 (car keymap)))
+          (dolist (command (sort (cdr keymap) 'string-lessp))
+            (princ (format-message " `%s'\n" command)))
+          (princ "\n"))))))
+
 (provide 'repeat)
 
 ;;; repeat.el ends here
diff --git a/lisp/replace.el b/lisp/replace.el
index b5dea61..fe2cbc4 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -432,6 +432,9 @@ In Transient Mark mode, if the mark is active, operate on 
the contents
 of the region.  Otherwise, operate from point to the end of the buffer's
 accessible portion.
 
+When invoked interactively, matching a newline with `\\n' will not work;
+use `C-q C-j' instead.  To match a tab character (`\\t'), just press `TAB'.
+
 Use \\<minibuffer-local-map>\\[next-history-element] \
 to pull the last incremental search regexp to the minibuffer
 that reads REGEXP, or invoke replacements from
diff --git a/lisp/reposition.el b/lisp/reposition.el
index 008fa00..02bee41 100644
--- a/lisp/reposition.el
+++ b/lisp/reposition.el
@@ -38,7 +38,7 @@
 ;;; Code:
 
 ;;;###autoload
-(defun reposition-window (&optional arg)
+(defun reposition-window (&optional arg interactive)
   "Make the current definition and/or comment visible.
 Further invocations move it to the top of the window or toggle the
 visibility of comments that precede it.
@@ -55,118 +55,124 @@ the comment lines.
 visible (if only part could otherwise be made so), to make the defun line
 visible (if point is in code and it could not be made so, or if only
 comments, including the first comment line, are visible), or to make the
-first comment line visible (if point is in a comment)."
-  (interactive "P")
-  (let* (;; (here (line-beginning-position))
-        (here (point))
-        ;; change this name once I've gotten rid of references to ht.
-        ;; this is actually the number of the last screen line
-        (ht (- (window-height) 2))
-        (line (repos-count-screen-lines (window-start) (point)))
-        (comment-height
-         ;; The call to max deals with the case of cursor between defuns.
-         (max 0
-              (repos-count-screen-lines-signed
-               ;; the beginning of the preceding comment
-               (save-excursion
-                 (if (not (eobp)) (forward-char 1))
-                 (end-of-defun -1)
-                 ;; Skip whitespace, newlines, and form feeds.
-                 (if (re-search-forward "[^ \t\n\f]" nil t)
-                     (backward-char 1))
-                 (point))
-               here)))
-        (defun-height
-          (repos-count-screen-lines-signed
-           (save-excursion
-             (end-of-defun 1) ; so comments associate with following defuns
-             (beginning-of-defun 1)
-             (point))
-           here))
-        ;; This must be positive, so don't use the signed version.
-        (defun-depth (repos-count-screen-lines here
-                                               (save-excursion
-                                                 (end-of-defun 1)
-                                                 (point))))
-        (defun-line-onscreen-p
-          (and (<= defun-height line)
-               (<= (- line defun-height) ht))))
-    (cond ((or (= comment-height line)
-              (and (= line ht)
-                   (> comment-height line)
-                   ;; if defun line offscreen, we should be in case 4
-                   defun-line-onscreen-p))
-          ;; Either first comment line is at top of screen or (point at
-          ;; bottom of screen, defun line onscreen, and first comment line
-          ;; off top of screen).  That is, it looks like we just did
-          ;; recenter-definition, trying to fit as much of the comment
-          ;; onscreen as possible.  Put defun line at top of screen; that
-          ;; is, show as much code, and as few comments, as possible.
-
-          (if (and arg (> defun-depth (1+ ht)))
-              ;; Can't fit whole defun onscreen without moving point.
-              (progn (end-of-defun) (beginning-of-defun) (recenter 0))
-            (recenter (max defun-height 0)))
-          ;;(repos-debug-macro "1")
-          )
-
-         ((or (= defun-height line)
-              (= line 0)
-              (and (< line comment-height)
-                   (< defun-height 0)))
-          ;; Defun line or cursor at top of screen, OR cursor in comment
-          ;; whose first line is offscreen.
-          ;; Avoid moving definition up even if defun runs offscreen;
-          ;; we care more about getting the comment onscreen.
-
-          (cond ((= line ht)
-                 ;; cursor on last screen line (and so in a comment)
-                 (if arg (progn (end-of-defun) (beginning-of-defun)))
-                 (recenter 0)
-                 ;;(repos-debug-macro "2a")
-                 )
-
-                ;; This condition, copied from case 4, may not be quite right
-
-                ((and arg (< ht comment-height))
-                 ;; Can't get first comment line onscreen.
-                 ;; Go there and try again.
-                 (forward-line (- comment-height))
-                 (beginning-of-line)
-                 ;; was (reposition-window)
-                 (recenter 0)
-                 ;;(repos-debug-macro "2b")
-                 )
-                (t
-                 (recenter (min ht comment-height))
-                 ;;(repos-debug-macro "2c")
-                 ))
-          ;; (recenter (min ht comment-height))
-          )
-
-         ((and (> (+ line defun-depth -1) ht)
-               defun-line-onscreen-p)
-          ;; Defun runs off the bottom of the screen and the defun line
-          ;; is onscreen.
-          ;; Move the defun up.
-          (recenter (max 0 (1+ (- ht defun-depth)) defun-height))
-          ;;(repos-debug-macro "3")
-          )
-
-         (t
-          ;; If on the bottom line and comment start is offscreen
-          ;; then just move all comments offscreen, or at least as
-          ;; far as they'll go.
-
-          ;; Try to get as much of the comments onscreen as possible.
-          (if (and arg (< ht comment-height))
-              ;; Can't get defun line onscreen; go there and try again.
-              (progn (forward-line (- defun-height))
-                     (beginning-of-line)
-                     (reposition-window))
-            (recenter (min ht comment-height)))
-          ;;(repos-debug-macro "4")
-          ))))
+first comment line visible (if point is in a comment).
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "P\nd")
+  (if interactive
+      (condition-case e
+          (reposition-window arg nil)
+        (scan-error (user-error (cadr e))))
+    (let* (;; (here (line-beginning-position))
+          (here (point))
+          ;; change this name once I've gotten rid of references to ht.
+          ;; this is actually the number of the last screen line
+          (ht (- (window-height) 2))
+          (line (repos-count-screen-lines (window-start) (point)))
+          (comment-height
+           ;; The call to max deals with the case of cursor between defuns.
+           (max 0
+                (repos-count-screen-lines-signed
+                 ;; the beginning of the preceding comment
+                 (save-excursion
+                   (if (not (eobp)) (forward-char 1))
+                   (end-of-defun -1)
+                   ;; Skip whitespace, newlines, and form feeds.
+                   (if (re-search-forward "[^ \t\n\f]" nil t)
+                       (backward-char 1))
+                   (point))
+                 here)))
+          (defun-height
+            (repos-count-screen-lines-signed
+             (save-excursion
+               (end-of-defun 1) ; so comments associate with following defuns
+               (beginning-of-defun 1)
+               (point))
+             here))
+          ;; This must be positive, so don't use the signed version.
+          (defun-depth (repos-count-screen-lines here
+                                                 (save-excursion
+                                                   (end-of-defun 1)
+                                                   (point))))
+          (defun-line-onscreen-p
+            (and (<= defun-height line)
+                 (<= (- line defun-height) ht))))
+      (cond ((or (= comment-height line)
+                (and (= line ht)
+                     (> comment-height line)
+                     ;; if defun line offscreen, we should be in case 4
+                     defun-line-onscreen-p))
+            ;; Either first comment line is at top of screen or (point at
+            ;; bottom of screen, defun line onscreen, and first comment line
+            ;; off top of screen).  That is, it looks like we just did
+            ;; recenter-definition, trying to fit as much of the comment
+            ;; onscreen as possible.  Put defun line at top of screen; that
+            ;; is, show as much code, and as few comments, as possible.
+
+            (if (and arg (> defun-depth (1+ ht)))
+                ;; Can't fit whole defun onscreen without moving point.
+                (progn (end-of-defun) (beginning-of-defun) (recenter 0))
+              (recenter (max defun-height 0)))
+            ;;(repos-debug-macro "1")
+            )
+
+           ((or (= defun-height line)
+                (= line 0)
+                (and (< line comment-height)
+                     (< defun-height 0)))
+            ;; Defun line or cursor at top of screen, OR cursor in comment
+            ;; whose first line is offscreen.
+            ;; Avoid moving definition up even if defun runs offscreen;
+            ;; we care more about getting the comment onscreen.
+
+            (cond ((= line ht)
+                   ;; cursor on last screen line (and so in a comment)
+                   (if arg (progn (end-of-defun) (beginning-of-defun)))
+                   (recenter 0)
+                   ;;(repos-debug-macro "2a")
+                   )
+
+                  ;; This condition, copied from case 4, may not be quite right
+
+                  ((and arg (< ht comment-height))
+                   ;; Can't get first comment line onscreen.
+                   ;; Go there and try again.
+                   (forward-line (- comment-height))
+                   (beginning-of-line)
+                   ;; was (reposition-window)
+                   (recenter 0)
+                   ;;(repos-debug-macro "2b")
+                   )
+                  (t
+                   (recenter (min ht comment-height))
+                   ;;(repos-debug-macro "2c")
+                   ))
+            ;; (recenter (min ht comment-height))
+            )
+
+           ((and (> (+ line defun-depth -1) ht)
+                 defun-line-onscreen-p)
+            ;; Defun runs off the bottom of the screen and the defun line
+            ;; is onscreen.
+            ;; Move the defun up.
+            (recenter (max 0 (1+ (- ht defun-depth)) defun-height))
+            ;;(repos-debug-macro "3")
+            )
+
+           (t
+            ;; If on the bottom line and comment start is offscreen
+            ;; then just move all comments offscreen, or at least as
+            ;; far as they'll go.
+
+            ;; Try to get as much of the comments onscreen as possible.
+            (if (and arg (< ht comment-height))
+                ;; Can't get defun line onscreen; go there and try again.
+                (progn (forward-line (- defun-height))
+                       (beginning-of-line)
+                       (reposition-window))
+              (recenter (min ht comment-height)))
+            ;;(repos-debug-macro "4")
+            )))))
 
 ;;; Auxiliary functions
 
diff --git a/lisp/savehist.el b/lisp/savehist.el
index b8e9d6b..6745d37 100644
--- a/lisp/savehist.el
+++ b/lisp/savehist.el
@@ -213,6 +213,7 @@ Normally invoked by calling `savehist-mode' to unset the 
minor mode."
     (cancel-timer savehist-timer)
     (setq savehist-timer nil)))
 
+(defvar savehist--has-given-file-warning nil)
 (defun savehist-save (&optional auto-save)
   "Save the values of minibuffer history variables.
 Unbound symbols referenced in `savehist-additional-variables' are ignored.
@@ -286,23 +287,29 @@ If AUTO-SAVE is non-nil, compare the saved contents to 
the one last saved,
     ;; If autosaving, avoid writing if nothing has changed since the
     ;; last write.
     (let ((checksum (md5 (current-buffer) nil nil savehist-coding-system)))
-      (unless (and auto-save (equal checksum savehist-last-checksum))
-       ;; Set file-precious-flag when saving the buffer because we
-       ;; don't want a half-finished write ruining the entire
-       ;; history.  Remember that this is run from a timer and from
-       ;; kill-emacs-hook, and also that multiple Emacs instances
-       ;; could write to this file at once.
-       (let ((file-precious-flag t)
-             (coding-system-for-write savehist-coding-system)
-              (dir (file-name-directory savehist-file)))
-          ;; Ensure that the directory exists before saving.
-          (unless (file-exists-p dir)
-            (make-directory dir t))
-         (write-region (point-min) (point-max) savehist-file nil
-                       (unless (called-interactively-p 'interactive) 'quiet)))
-       (when savehist-file-modes
-         (set-file-modes savehist-file savehist-file-modes))
-       (setq savehist-last-checksum checksum)))))
+      (condition-case err
+        (unless (and auto-save (equal checksum savehist-last-checksum))
+         ;; Set file-precious-flag when saving the buffer because we
+         ;; don't want a half-finished write ruining the entire
+         ;; history.  Remember that this is run from a timer and from
+         ;; kill-emacs-hook, and also that multiple Emacs instances
+         ;; could write to this file at once.
+         (let ((file-precious-flag t)
+               (coding-system-for-write savehist-coding-system)
+                (dir (file-name-directory savehist-file)))
+            ;; Ensure that the directory exists before saving.
+            (unless (file-exists-p dir)
+              (make-directory dir t))
+           (write-region (point-min) (point-max) savehist-file nil
+                         (unless (called-interactively-p 'interactive) 
'quiet)))
+         (when savehist-file-modes
+           (set-file-modes savehist-file savehist-file-modes))
+         (setq savehist-last-checksum checksum))
+        (file-error
+         (unless savehist--has-given-file-warning
+          (lwarn '(savehist-file) :warning "Error writing `%s': %s"
+                 savehist-file (caddr err))
+          (setq savehist--has-given-file-warning t)))))))
 
 (defun savehist-autosave ()
   "Save the minibuffer history if it has been modified since the last save.
diff --git a/lisp/server.el b/lisp/server.el
index 220694f..ac5db19 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -413,9 +413,14 @@ If CLIENT is non-nil, add a description of it to the 
logged message."
   ;; for possible servers before doing anything, so it *should* be ours.
   (and (process-contact proc :server)
        (eq (process-status proc) 'closed)
+       ;; If this variable is non-nil, the socket was passed in to
+       ;; Emacs, and not created by Emacs itself (for instance,
+       ;; created by systemd).  In that case, don't delete the socket.
+       (not internal--daemon-sockname)
        (ignore-errors
         (delete-file (process-get proc :server-file))))
-  (server-log (format "Status changed to %s: %s" (process-status proc) msg) 
proc)
+  (server-log (format "Status changed to %s: %s"
+                      (process-status proc) msg) proc)
   (server-delete-client proc))
 
 (defun server--on-display-p (frame display)
@@ -1303,7 +1308,17 @@ The following commands are accepted by the client:
                                                       frame-parameters))
                   ;; When resuming on a tty, tty-name is nil.
                   (tty-name
-                   (server-create-tty-frame tty-name tty-type proc))))
+                   (server-create-tty-frame tty-name tty-type proc))
+
+                   ;; If there won't be a current frame to use, fall
+                   ;; back to trying to create a new one.
+                  ((and use-current-frame
+                        (daemonp)
+                        (null (cdr (frame-list)))
+                        (eq (selected-frame) terminal-frame)
+                        display)
+                   (setq tty-name nil tty-type nil)
+                   (server-select-display display))))
 
             (process-put
              proc 'continuation
@@ -1598,7 +1613,9 @@ prevent a backup for it.)  The variable 
`server-temp-file-regexp' controls
 which filenames are considered temporary.
 
 If invoked with a prefix argument, or if there is no server process running,
-starts server process and that is all.  Invoked by \\[server-edit]."
+starts server process and that is all.  Invoked by \\[server-edit].
+
+To abort an edit instead of saying \"Done\", use \\[server-edit-abort]."
   (interactive "P")
   (cond
    ((or arg
@@ -1608,6 +1625,17 @@ starts server process and that is all.  Invoked by 
\\[server-edit]."
    (server-clients (apply #'server-switch-buffer (server-done)))
    (t (message "No server editing buffers exist"))))
 
+(defun server-edit-abort ()
+  "Abort editing the current client buffer."
+  (interactive)
+  (if server-clients
+      (mapc (lambda (proc)
+              (server-send-string
+               proc (concat "-error "
+                            (server-quote-arg "Aborted by the user"))))
+            server-clients)
+    (message "This buffer has no clients")))
+
 (defun server-switch-buffer (&optional next-buffer killed-one filepos
                                        this-frame-only)
   "Switch to another buffer, preferably one that has a client.
diff --git a/lisp/ses.el b/lisp/ses.el
index bc3c2de..ca515f8 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -2252,9 +2252,8 @@ Based on the current set of columns and `window-hscroll' 
position."
                                                  (push (symbol-name key) 
names))
                                               ses--named-cell-hashmap)
                                      names)))))
-                (if
-                    (string= s "")
-                    (error "Invalid cell name")
+                (if (string= s "")
+                    (user-error "Invalid cell name")
                   (list (intern s)))))
   (let ((rowcol (ses-sym-rowcol sym)))
     (or rowcol (error "Invalid cell name"))
@@ -3381,7 +3380,7 @@ while in the SES buffer."
           ((derived-mode-p 'ses-mode) ses--local-printer-hashmap)
           ((minibufferp) ses--completion-table)
           ((derived-mode-p 'help-mode) nil)
-          (t (error "Not in a SES buffer")))))
+          (t (user-error "Not in a SES buffer")))))
   (when local-printer-hashmap
     (let ((ses--list-orig-buffer (or ses--list-orig-buffer (current-buffer))))
       (help-setup-xref
@@ -3415,7 +3414,7 @@ while in the SES buffer."
           ((derived-mode-p 'ses-mode) ses--named-cell-hashmap)
           ((minibufferp) ses--completion-table)
           ((derived-mode-p 'help-mode) nil)
-          (t (error "Not in a SES buffer")))))
+          (t (user-error "Not in a SES buffer")))))
   (when named-cell-hashmap
     (let ((ses--list-orig-buffer (or ses--list-orig-buffer (current-buffer))))
       (help-setup-xref
@@ -3458,7 +3457,9 @@ With a \\[universal-argument] prefix arg, prompt the user.
 The top row is row 1.  Selecting row 0 displays the default header row."
   (interactive
    (list (if (numberp current-prefix-arg) current-prefix-arg
-          (let ((currow (1+ (car (ses-sym-rowcol ses--curcell)))))
+          (let* ((curcell (or (ses--cell-at-pos (point))
+                               (user-error "Invalid header-row")))
+                  (currow (1+ (car (ses-sym-rowcol curcell)))))
             (if current-prefix-arg
                 (read-number "Header row: " currow)
               currow)))))
diff --git a/lisp/shell.el b/lisp/shell.el
index 3098d3a..4339e8c 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -321,6 +321,15 @@ Thus, this does not include the shell's current 
directory.")
 (defvar shell-dirstack-query nil
   "Command used by `shell-resync-dirs' to query the shell.")
 
+(defcustom shell-has-auto-cd nil
+  "If non-nil, `shell-mode' handles implicit \"cd\" commands.
+Implicit \"cd\" is changing the directory if the command is a directory.
+You can make this variable buffer-local to change it, per shell-mode instance.
+Useful for shells like zsh that has this feature."
+  :type 'boolean
+  :group 'shell-directories
+  :version "28.1")
+
 (defvar shell-mode-map
   (let ((map (make-sparse-keymap)))
     (define-key map "\C-c\C-f" 'shell-forward-command)
@@ -750,7 +759,8 @@ Make the shell buffer the current buffer, and return it.
                  (file-local-name
                   (expand-file-name
                    (read-file-name "Remote shell path: " default-directory
-                                   shell-file-name t shell-file-name)))))
+                                   shell-file-name t shell-file-name
+                                   #'file-remote-p)))))
 
    ;; Rain or shine, BUFFER must be current by now.
    (unless (comint-check-proc buffer)
@@ -836,13 +846,15 @@ Environment variables are expanded, see function 
`substitute-in-file-name'."
                               str) ; skip whitespace
                              (match-end 0)))
                (case-fold-search)
-               end cmd arg1)
+               end cmd arg1 cmd-subst-fn)
            (while (string-match shell-command-regexp str start)
              (setq end (match-end 0)
                    cmd (comint-arguments (substring str start end) 0 0)
                    arg1 (comint-arguments (substring str start end) 1 1))
              (if arg1
                  (setq arg1 (shell-unquote-argument arg1)))
+              (if shell-has-auto-cd
+                  (setq cmd-subst-fn (comint-substitute-in-file-name cmd)))
              (cond ((string-match (concat "\\`\\(" shell-popd-regexp
                                           "\\)\\($\\|[ \t]\\)")
                                   cmd)
@@ -859,7 +871,9 @@ Environment variables are expanded, see function 
`substitute-in-file-name'."
                          (string-match (concat "\\`\\(" shell-chdrive-regexp
                                                "\\)\\($\\|[ \t]\\)")
                                        cmd))
-                    (shell-process-cd (comint-substitute-in-file-name cmd))))
+                    (shell-process-cd (comint-substitute-in-file-name cmd)))
+                    ((and shell-has-auto-cd (file-directory-p cmd-subst-fn))
+                     (shell-process-cd cmd-subst-fn)))
              (setq start (progn (string-match shell-command-separator-regexp
                                               str end)
                                 ;; skip again
diff --git a/lisp/simple.el b/lisp/simple.el
index 26eb8ca..f746d73 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -190,7 +190,7 @@ to navigate in it.")
 It takes two arguments, a buffer position in the error buffer
 and a buffer position in the error locus buffer.
 The buffer for the error locus should already be current.
-nil means use goto-char using the second argument position.")
+nil means use `goto-char' using the second argument position.")
 
 (defsubst next-error-buffer-p (buffer
                               &optional avoid-current
@@ -389,7 +389,7 @@ Intended to be used in `next-error-found-function'."
 (defcustom next-error-found-function #'ignore
   "Function called when a next locus is found and displayed.
 Function is called with two arguments: a FROM-BUFFER buffer
-from which next-error navigated, and a target buffer TO-BUFFER."
+from which `next-error' navigated, and a target buffer TO-BUFFER."
   :type '(choice (const :tag "No default" ignore)
                  (const :tag "Quit previous window with M-0"
                         next-error-quit-window)
@@ -399,7 +399,7 @@ from which next-error navigated, and a target buffer 
TO-BUFFER."
 
 (defun next-error-found (&optional from-buffer to-buffer)
   "Function to call when the next locus is found and displayed.
-FROM-BUFFER is a buffer from which next-error navigated,
+FROM-BUFFER is a buffer from which `next-error' navigated,
 and TO-BUFFER is a target buffer."
   (setq next-error-last-buffer (or from-buffer (current-buffer)))
   (when to-buffer
@@ -597,10 +597,12 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
          ;; Don't auto-fill if we have a prefix argument.
          (auto-fill-function (if arg nil auto-fill-function))
          (arg (prefix-numeric-value arg))
+         (procsym (make-symbol "newline-postproc")) ;(bug#46326)
          (postproc
           ;; Do the rest in post-self-insert-hook, because we want to do it
           ;; *before* other functions on that hook.
           (lambda ()
+            (remove-hook 'post-self-insert-hook procsym t)
             ;; Mark the newline(s) `hard'.
             (if use-hard-newlines
                 (set-hard-newline-properties
@@ -619,6 +621,7 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
             ;; starts a page.
             (or was-page-start
                 (move-to-left-margin nil t)))))
+    (fset procsym postproc)
     (if (not interactive)
        ;; FIXME: For non-interactive uses, many calls actually
        ;; just want (insert "\n"), so maybe we should do just
@@ -628,13 +631,13 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
          (self-insert-command arg))
       (unwind-protect
          (progn
-           (add-hook 'post-self-insert-hook postproc nil t)
+           (add-hook 'post-self-insert-hook procsym nil t)
            (self-insert-command arg))
        ;; We first used let-binding to protect the hook, but that
        ;; was naive since add-hook affects the symbol-default
        ;; value of the variable, whereas the let-binding might
        ;; protect only the buffer-local value.
-       (remove-hook 'post-self-insert-hook postproc t))))
+       (remove-hook 'post-self-insert-hook procsym t))))
   nil)
 
 (defun set-hard-newline-properties (from to)
@@ -1658,6 +1661,7 @@ in *Help* buffer.  See also the command `describe-char'."
     (define-key m "\t" 'completion-at-point)
     (define-key m "\r" 'read--expression-try-read)
     (define-key m "\n" 'read--expression-try-read)
+    (define-key m "\M-g\M-c" 'read-expression-switch-to-completions)
     (set-keymap-parent m minibuffer-local-map)
     m))
 
@@ -1800,8 +1804,8 @@ moving point."
 
 (defun eval-expression-get-print-arguments (prefix-argument)
   "Get arguments for commands that print an expression result.
-Returns a list (INSERT-VALUE NO-TRUNCATE CHAR-PRINT-LIMIT)
-based on PREFIX-ARG.  This function determines the interpretation
+Returns a list (INSERT-VALUE NO-TRUNCATE CHAR-PRINT-LIMIT) based
+on PREFIX-ARGUMENT.  This function determines the interpretation
 of the prefix argument for `eval-expression' and
 `eval-last-sexp'."
   (let ((num (prefix-numeric-value prefix-argument)))
@@ -1982,7 +1986,8 @@ This function uses the `read-extended-command-predicate' 
user option."
        (concat (cond
                ((eq current-prefix-arg '-) "- ")
                ((and (consp current-prefix-arg)
-                     (eq (car current-prefix-arg) 4)) "C-u ")
+                     (eq (car current-prefix-arg) 4))
+                "C-u ")
                ((and (consp current-prefix-arg)
                      (integerp (car current-prefix-arg)))
                 (format "%d " (car current-prefix-arg)))
@@ -2002,7 +2007,29 @@ This function uses the `read-extended-command-predicate' 
user option."
             '(metadata
               (affixation-function . read-extended-command--affixation)
               (category . command))
-           (complete-with-action action obarray string pred)))
+           (let ((pred
+                  (if (memq action '(nil t))
+                      ;; Exclude from completions obsolete commands
+                      ;; lacking a `current-name', or where `when' is
+                      ;; not the current major version.
+                      (lambda (sym)
+                        (let ((obsolete (get sym 'byte-obsolete-info)))
+                          (and (funcall pred sym)
+                               (or (equal string (symbol-name sym))
+                                   (not obsolete)
+                                   (and
+                                    ;; Has a current-name.
+                                    (functionp (car obsolete))
+                                    ;; when >= emacs-major-version
+                                    (condition-case nil
+                                        (>= (car (version-to-list
+                                                  (caddr obsolete)))
+                                            emacs-major-version)
+                                      ;; If the obsoletion version isn't
+                                      ;; valid, include the command.
+                                      (error t)))))))
+                    pred)))
+             (complete-with-action action obarray string pred))))
        (lambda (sym)
          (and (commandp sym)
               (cond ((null read-extended-command-predicate))
@@ -3376,8 +3403,7 @@ is not *inside* the region START...END."
              (> (cdr undo-elt) start)))))
 
 (defun undo-adjust-elt (elt deltas)
-  "Return adjustment of undo element ELT by the undo DELTAS
-list."
+  "Return adjustment of undo element ELT by the undo DELTAS list."
   (pcase elt
     ;; POSITION
     ((pred integerp)
@@ -3421,8 +3447,7 @@ list."
 ;; There was no strong reason to prefer one or the other, except that
 ;; the first is more consistent with prior undo in region behavior.
 (defun undo-adjust-beg-end (beg end deltas)
-  "Return cons of adjustments to BEG and END by the undo DELTAS
-list."
+  "Return cons of adjustments to BEG and END by the undo DELTAS list."
   (let ((adj-beg (undo-adjust-pos beg deltas)))
     ;; Note: option 2 above would be like (cons (min ...) adj-end)
     (cons adj-beg
@@ -4192,12 +4217,22 @@ impose the use of a shell (with its need to quote 
arguments)."
            (shell-command-on-region (point) (point) command
                                     output-buffer nil error-buffer)))))))
 
+(defun max-mini-window-lines (&optional frame)
+  "Compute maximum number of lines for echo area in FRAME.
+As defined by `max-mini-window-height'.  FRAME defaults to the
+selected frame.  Result may be a floating-point number,
+i.e. include a fractional number of lines."
+  (cond ((floatp max-mini-window-height) (* (frame-height frame)
+                                           max-mini-window-height))
+       ((integerp max-mini-window-height) max-mini-window-height)
+       (t 1)))
+
 (defun display-message-or-buffer (message &optional buffer-name action frame)
   "Display MESSAGE in the echo area if possible, otherwise in a pop-up buffer.
 MESSAGE may be either a string or a buffer.
 
 A pop-up buffer is displayed using `display-buffer' if MESSAGE is too long
-for maximum height of the echo area, as defined by `max-mini-window-height'
+for maximum height of the echo area, as defined by `max-mini-window-lines'
 if `resize-mini-windows' is non-nil.
 
 Returns either the string shown in the echo area, or when a pop-up
@@ -4236,14 +4271,7 @@ and are used only if a pop-up buffer is displayed."
             (cond ((= lines 0))
                   ((and (or (<= lines 1)
                             (<= lines
-                                (if resize-mini-windows
-                                    (cond ((floatp max-mini-window-height)
-                                           (* (frame-height)
-                                              max-mini-window-height))
-                                          ((integerp max-mini-window-height)
-                                           max-mini-window-height)
-                                          (t
-                                           1))
+                                (if resize-mini-windows (max-mini-window-lines)
                                   1)))
                         ;; Don't use the echo area if the output buffer is
                         ;; already displayed in the selected frame.
@@ -4309,7 +4337,7 @@ current buffer after START.
 
 Optional fifth arg REPLACE, if non-nil, means to insert the
 output in place of text from START to END, putting point and mark
-around it.
+around it.  If REPLACE is the symbol `no-mark', don't set the mark.
 
 Optional sixth arg ERROR-BUFFER, if non-nil, specifies a buffer
 or buffer name to which to direct the command's standard error
@@ -4384,7 +4412,9 @@ characters."
           (let ((swap (and replace (< start end))))
             ;; Don't muck with mark unless REPLACE says we should.
             (goto-char start)
-            (and replace (push-mark (point) 'nomsg))
+            (when (and replace
+                       (not (eq replace 'no-mark)))
+              (push-mark (point) 'nomsg))
             (setq exit-status
                   (call-shell-region start end command replace
                                        (if error-file
@@ -4395,7 +4425,9 @@ characters."
             ;;   (and shell-buffer (not (eq shell-buffer (current-buffer)))
             ;;          (kill-buffer shell-buffer)))
             ;; Don't muck with mark unless REPLACE says we should.
-            (and replace swap (exchange-point-and-mark)))
+            (when (and replace swap
+                       (not (eq replace 'no-mark)))
+              (exchange-point-and-mark)))
         ;; No prefix argument: put the output in a temp buffer,
         ;; replacing its entire contents.
         (let ((buffer (get-buffer-create
@@ -5005,12 +5037,19 @@ ring directly.")
   "The tail of the kill ring whose car is the last thing yanked.")
 
 (defcustom save-interprogram-paste-before-kill nil
-  "Save existing clipboard text into kill ring before replacing it.
-A non-nil value ensures that Emacs kill operations do not
-irrevocably overwrite existing clipboard text by saving it to the
-`kill-ring' prior to the kill.  Such text can subsequently be
-retrieved via \\[yank] \\[yank-pop]."
-  :type 'boolean
+  "Whether to save existing clipboard text into kill ring before replacing it.
+A non-nil value means the clipboard text is saved to the `kill-ring'
+prior to any kill command.  Such text can subsequently be retrieved
+via \\[yank] \\[yank-pop].  This ensures that Emacs kill operations
+do not irrevocably overwrite existing clipboard text.
+
+The value of this variable can also be a number, in which case the
+clipboard data is only saved to the `kill-ring' if it's shorter
+(in characters) than that number.  Any other non-nil value will save
+the clipboard data unconditionally."
+  :type '(choice (const nil)
+                 number
+                 (other :tag "Always" t))
   :group 'killing
   :version "23.2")
 
@@ -5021,6 +5060,16 @@ The comparison is done using 
`equal-including-properties'."
   :group 'killing
   :version "23.2")
 
+(defcustom kill-transform-function nil
+  "Function to call to transform a string before it's put on the kill ring.
+The function is called with one parameter (the string that's to
+be put on the kill ring).  It should return a string or nil.  If
+the latter, the string is not put on the kill ring."
+  :type '(choice (const :tag "No transform" nil)
+                 function)
+  :group 'killing
+  :version "28.1")
+
 (defun kill-new (string &optional replace)
   "Make STRING the latest kill in the kill ring.
 Set `kill-ring-yank-pointer' to point to it.
@@ -5036,33 +5085,41 @@ When the yank handler has a non-nil PARAM element, the 
original STRING
 argument is not used by `insert-for-yank'.  However, since Lisp code
 may access and use elements from the kill ring directly, the STRING
 argument should still be a \"useful\" string for such uses."
-  (unless (and kill-do-not-save-duplicates
-              ;; Due to text properties such as 'yank-handler that
-              ;; can alter the contents to yank, comparison using
-              ;; `equal' is unsafe.
-              (equal-including-properties string (car kill-ring)))
-    (if (fboundp 'menu-bar-update-yank-menu)
-       (menu-bar-update-yank-menu string (and replace (car kill-ring)))))
-  (when save-interprogram-paste-before-kill
-    (let ((interprogram-paste (and interprogram-paste-function
-                                   (funcall interprogram-paste-function))))
-      (when interprogram-paste
-        (dolist (s (if (listp interprogram-paste)
-                       ;; Use `reverse' to avoid modifying external data.
-                       (reverse interprogram-paste)
-                    (list interprogram-paste)))
-         (unless (and kill-do-not-save-duplicates
-                      (equal-including-properties s (car kill-ring)))
-           (push s kill-ring))))))
-  (unless (and kill-do-not-save-duplicates
-              (equal-including-properties string (car kill-ring)))
-    (if (and replace kill-ring)
-       (setcar kill-ring string)
-      (let ((history-delete-duplicates nil))
-        (add-to-history 'kill-ring string kill-ring-max t))))
-  (setq kill-ring-yank-pointer kill-ring)
-  (if interprogram-cut-function
-      (funcall interprogram-cut-function string)))
+  ;; Allow the user to transform or ignore the string.
+  (when (or (not kill-transform-function)
+            (setq string (funcall kill-transform-function string)))
+    (unless (and kill-do-not-save-duplicates
+                ;; Due to text properties such as 'yank-handler that
+                ;; can alter the contents to yank, comparison using
+                ;; `equal' is unsafe.
+                (equal-including-properties string (car kill-ring)))
+      (if (fboundp 'menu-bar-update-yank-menu)
+         (menu-bar-update-yank-menu string (and replace (car kill-ring)))))
+    (when save-interprogram-paste-before-kill
+      (let ((interprogram-paste (and interprogram-paste-function
+                                     (funcall interprogram-paste-function))))
+        (when interprogram-paste
+          (setq interprogram-paste
+                (if (listp interprogram-paste)
+                    ;; Use `reverse' to avoid modifying external data.
+                    (reverse interprogram-paste)
+                 (list interprogram-paste)))
+          (when (or (not (numberp save-interprogram-paste-before-kill))
+                    (< (seq-reduce #'+ (mapcar #'length interprogram-paste) 0)
+                       save-interprogram-paste-before-kill))
+            (dolist (s interprogram-paste)
+             (unless (and kill-do-not-save-duplicates
+                           (equal-including-properties s (car kill-ring)))
+               (push s kill-ring)))))))
+    (unless (and kill-do-not-save-duplicates
+                (equal-including-properties string (car kill-ring)))
+      (if (and replace kill-ring)
+         (setcar kill-ring string)
+        (let ((history-delete-duplicates nil))
+          (add-to-history 'kill-ring string kill-ring-max t))))
+    (setq kill-ring-yank-pointer kill-ring)
+    (if interprogram-cut-function
+        (funcall interprogram-cut-function string))))
 
 ;; It has been argued that this should work like `self-insert-command'
 ;; which merges insertions in `buffer-undo-list' in groups of 20
@@ -5244,8 +5301,7 @@ region instead.
 This command's old key binding has been given to `kill-ring-save'."
   ;; Pass mark first, then point, because the order matters when
   ;; calling `kill-append'.
-  (interactive (list (mark) (point)
-                    (prefix-numeric-value current-prefix-arg)))
+  (interactive (list (mark) (point) 'region))
   (let ((str (if region
                  (funcall region-extract-function nil)
                (filter-buffer-substring beg end))))
@@ -5277,8 +5333,7 @@ This command is similar to `copy-region-as-kill', except 
that it gives
 visual feedback indicating the extent of the region being copied."
   ;; Pass mark first, then point, because the order matters when
   ;; calling `kill-append'.
-  (interactive (list (mark) (point)
-                    (prefix-numeric-value current-prefix-arg)))
+  (interactive (list (mark) (point) 'region))
   (copy-region-as-kill beg end region)
   ;; This use of called-interactively-p is correct because the code it
   ;; controls just gives the user visual feedback.
@@ -5544,29 +5599,29 @@ Normally set from the UNDO element of a yank-handler; 
see `insert-for-yank'.")
   "Replace just-yanked stretch of killed text with a different stretch.
 The main use of this command is immediately after a `yank' or a
 `yank-pop'.  At such a time, the region contains a stretch of
-reinserted previously-killed text.  `yank-pop' deletes that text
-and inserts in its place a different stretch of killed text by
-traversing the value of the `kill-ring' variable.
+reinserted (\"pasted\") previously-killed text.  `yank-pop' deletes
+that text and inserts in its place a different stretch of killed text
+by traversing the value of the `kill-ring' variable and selecting
+another kill from there.
 
 With no argument, the previous kill is inserted.
 With argument N, insert the Nth previous kill.
-If N is negative, this is a more recent kill.
+If N is negative, it means to use a more recent kill.
 
-The sequence of kills wraps around, so that after the oldest one
-comes the newest one.
+The sequence of kills wraps around, so if you keep invoking this command
+time after time, and pass the oldest kill, you get the newest one.
+
+You can also invoke this command after a command other than `yank'
+or `yank-pop'.  This is the same as invoking `yank-from-kill-ring',
+including the effect of the prefix argument; see there for the details.
 
 This command honors the `yank-handled-properties' and
 `yank-excluded-properties' variables, and the `yank-handler' text
-property, in the way that `yank' does.
-
-When this command is called not immediately after a `yank' or a
-`yank-pop', then it activates the minibuffer with its completion
-and history filled with previously-killed items from the
-`kill-ring' variable, and reads a string to yank at point.
-See `yank-from-kill-ring' for more details."
+property, in the way that `yank' does."
   (interactive "p")
   (if (not (eq last-command 'yank))
-      (yank-from-kill-ring (read-from-kill-ring) current-prefix-arg)
+      (yank-from-kill-ring (read-from-kill-ring "Yank from kill-ring: ")
+                           current-prefix-arg)
     (setq this-command 'yank)
     (unless arg (setq arg 1))
     (let ((inhibit-read-only t)
@@ -5655,11 +5710,15 @@ With ARG, rotate that many kills forward (or backward, 
if negative)."
   (current-kill arg))
 
 (defvar read-from-kill-ring-history)
-(defun read-from-kill-ring ()
-  "Read a string from `kill-ring' using completion and minibuffer history."
+(defun read-from-kill-ring (prompt)
+  "Read a `kill-ring' entry using completion and minibuffer history.
+PROMPT is a string to prompt with."
   ;; `current-kill' updates `kill-ring' with a possible interprogram-paste
   (current-kill 0)
   (let* ((history-add-new-input nil)
+         (history-pos (when yank-from-kill-ring-rotate
+                        (- (length kill-ring)
+                           (length kill-ring-yank-pointer))))
          (ellipsis (if (char-displayable-p ?…) "…" "..."))
          ;; Remove keymaps from text properties of copied string,
          ;; because typing RET in the minibuffer might call
@@ -5700,32 +5759,61 @@ With ARG, rotate that many kills forward (or backward, 
if negative)."
              (define-key map "?" nil)
              map)))
       (completing-read
-       "Yank from kill-ring: "
+       prompt
        (lambda (string pred action)
          (if (eq action 'metadata)
              ;; Keep sorted by recency
              '(metadata (display-sort-function . identity))
            (complete-with-action action completions string pred)))
        nil nil nil
-       'read-from-kill-ring-history))))
+       (if history-pos
+           (cons 'read-from-kill-ring-history
+                 (if (zerop history-pos) history-pos (1+ history-pos)))
+         'read-from-kill-ring-history)))))
+
+(defcustom yank-from-kill-ring-rotate t
+  "Whether using `yank-from-kill-ring' should rotate `kill-ring-yank-pointer'.
+If non-nil, the kill ring is rotated after selecting previously killed text."
+  :type 'boolean
+  :group 'killing
+  :version "28.1")
 
 (defun yank-from-kill-ring (string &optional arg)
-  "Insert the `kill-ring' item selected from the minibuffer history.
-Use minibuffer navigation and search commands to browse the
-previously-killed items from the `kill-ring' variable in the
-minibuffer history before typing RET to insert the selected item,
-or use completion on the elements of `kill-ring'.  You can edit
-the item in the minibuffer before inserting it.
-
-With \\[universal-argument] as argument, put point at beginning,
-and mark at end, like `yank' does."
-  (interactive (list (read-from-kill-ring) current-prefix-arg))
+  "Select a stretch of previously killed text and insert (\"paste\") it.
+This command allows to choose one of the stretches of text killed
+or yanked by previous commands, which are recorded in `kill-ring',
+and reinsert the chosen kill at point.
+
+This command prompts for a previously-killed text in the minibuffer.
+Use the minibuffer history and search commands, or the minibuffer
+completion commands, to select a previously-killed text.  In
+particular, typing \\<minibuffer-local-completion-map>\\[minibuffer-complete] 
at the prompt will pop up a buffer showing
+all the previously-killed stretches of text from which you can
+choose the one you want to reinsert.
+Once you select the text you want to reinsert, type 
\\<minibuffer-local-map>\\[exit-minibuffer] to actually
+insert it and exit the minibuffer.
+You can also edit the selected text in the minibuffer before
+inserting it.
+
+With \\[universal-argument] as argument, this command puts point at
+beginning of the inserted text and mark at the end, like `yank' does.
+
+When called from Lisp, insert STRING like `insert-for-yank' does."
+  (interactive (list (read-from-kill-ring "Yank from kill-ring: ")
+                     current-prefix-arg))
+  (setq yank-window-start (window-start))
   (push-mark)
   (insert-for-yank string)
+  (when yank-from-kill-ring-rotate
+    (let ((pos (seq-position kill-ring string)))
+      (if pos
+          (setq kill-ring-yank-pointer (nthcdr pos kill-ring))
+        (kill-new string))))
   (if (consp arg)
-      ;; Swap point and mark like in `yank'.
+      ;; Swap point and mark like in `yank' and `yank-pop'.
       (goto-char (prog1 (mark t)
                    (set-marker (mark-marker) (point) (current-buffer))))))
+
 
 ;; Some kill commands.
 
@@ -6918,11 +7006,13 @@ The value is a floating-point number."
               (or (null rbot) (= rbot 0)))
          nil)
         ;; If cursor is not in the bottom scroll margin, and the
-        ;; current line is not too tall, move forward.
+        ;; current line is not too tall, or if there's a continuation
+        ;; line below this one, move forward.
         ((and (or (null this-height) (<= this-height winh))
               vpos
               (> vpos 0)
-              (< py last-line))
+              (or (< py last-line)
+                   (display--line-is-continued-p)))
          nil)
         ;; When already vscrolled, we vscroll some more if we can,
         ;; or clear vscroll and move forward at end of tall image.
@@ -7691,44 +7781,53 @@ are interchanged."
   (interactive "*p")
   (transpose-subr 'forward-word arg))
 
-(defun transpose-sexps (arg)
+(defun transpose-sexps (arg &optional interactive)
   "Like \\[transpose-chars] (`transpose-chars'), but applies to sexps.
 Unlike `transpose-words', point must be between the two sexps and not
 in the middle of a sexp to be transposed.
 With non-zero prefix arg ARG, effect is to take the sexp before point
 and drag it forward past ARG other sexps (backward if ARG is negative).
 If ARG is zero, the sexps ending at or after point and at or after mark
-are interchanged."
-  (interactive "*p")
-  (transpose-subr
-   (lambda (arg)
-     ;; Here we should try to simulate the behavior of
-     ;; (cons (progn (forward-sexp x) (point))
-     ;;       (progn (forward-sexp (- x)) (point)))
-     ;; Except that we don't want to rely on the second forward-sexp
-     ;; putting us back to where we want to be, since forward-sexp-function
-     ;; might do funny things like infix-precedence.
-     (if (if (> arg 0)
-            (looking-at "\\sw\\|\\s_")
-          (and (not (bobp))
-               (save-excursion (forward-char -1) (looking-at "\\sw\\|\\s_"))))
-        ;; Jumping over a symbol.  We might be inside it, mind you.
-        (progn (funcall (if (> arg 0)
-                            'skip-syntax-backward 'skip-syntax-forward)
-                        "w_")
-               (cons (save-excursion (forward-sexp arg) (point)) (point)))
-       ;; Otherwise, we're between sexps.  Take a step back before jumping
-       ;; to make sure we'll obey the same precedence no matter which direction
-       ;; we're going.
-       (funcall (if (> arg 0) 'skip-syntax-backward 'skip-syntax-forward) " .")
-       (cons (save-excursion (forward-sexp arg) (point))
-            (progn (while (or (forward-comment (if (> arg 0) 1 -1))
-                              (not (zerop (funcall (if (> arg 0)
-                                                       'skip-syntax-forward
-                                                     'skip-syntax-backward)
-                                                   ".")))))
-                   (point)))))
-   arg 'special))
+are interchanged.
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "*p\nd")
+  (if interactive
+      (condition-case nil
+          (transpose-sexps arg nil)
+        (scan-error (user-error "Not between two complete sexps")))
+    (transpose-subr
+     (lambda (arg)
+       ;; Here we should try to simulate the behavior of
+       ;; (cons (progn (forward-sexp x) (point))
+       ;;       (progn (forward-sexp (- x)) (point)))
+       ;; Except that we don't want to rely on the second forward-sexp
+       ;; putting us back to where we want to be, since forward-sexp-function
+       ;; might do funny things like infix-precedence.
+       (if (if (> arg 0)
+              (looking-at "\\sw\\|\\s_")
+            (and (not (bobp))
+                 (save-excursion
+                    (forward-char -1)
+                    (looking-at "\\sw\\|\\s_"))))
+          ;; Jumping over a symbol.  We might be inside it, mind you.
+          (progn (funcall (if (> arg 0)
+                              'skip-syntax-backward 'skip-syntax-forward)
+                          "w_")
+                 (cons (save-excursion (forward-sexp arg) (point)) (point)))
+         ;; Otherwise, we're between sexps.  Take a step back before jumping
+         ;; to make sure we'll obey the same precedence no matter which
+         ;; direction we're going.
+         (funcall (if (> arg 0) 'skip-syntax-backward 'skip-syntax-forward)
+                  " .")
+         (cons (save-excursion (forward-sexp arg) (point))
+              (progn (while (or (forward-comment (if (> arg 0) 1 -1))
+                                (not (zerop (funcall (if (> arg 0)
+                                                         'skip-syntax-forward
+                                                       'skip-syntax-backward)
+                                                     ".")))))
+                     (point)))))
+     arg 'special)))
 
 (defun transpose-lines (arg)
   "Exchange current line and previous line, leaving point after both.
@@ -8770,6 +8869,8 @@ makes it easier to edit it."
 
 (defvar completion-list-mode-map
   (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map special-mode-map)
+    (define-key map "g" nil) ;; There's nothing to revert from.
     (define-key map [mouse-2] 'choose-completion)
     (define-key map [follow-link] 'mouse-face)
     (define-key map [down-mouse-2] nil)
@@ -8779,8 +8880,10 @@ makes it easier to edit it."
     (define-key map [right] 'next-completion)
     (define-key map [?\t] 'next-completion)
     (define-key map [backtab] 'previous-completion)
-    (define-key map "q" 'quit-window)
     (define-key map "z" 'kill-current-buffer)
+    (define-key map "n" 'next-completion)
+    (define-key map "p" 'previous-completion)
+    (define-key map "\M-g\M-c" 'switch-to-minibuffer)
     map)
   "Local map for completion list buffers.")
 
@@ -8867,18 +8970,17 @@ If EVENT, use EVENT's position to determine the 
starting position."
           (choice
            (save-excursion
              (goto-char (posn-point (event-start event)))
-             (let (beg end)
+             (let (beg)
                (cond
                 ((and (not (eobp)) (get-text-property (point) 'mouse-face))
-                 (setq end (point) beg (1+ (point))))
+                 (setq beg (1+ (point))))
                 ((and (not (bobp))
                       (get-text-property (1- (point)) 'mouse-face))
-                 (setq end (1- (point)) beg (point)))
+                 (setq beg (point)))
                 (t (error "No completion here")))
                (setq beg (previous-single-property-change beg 'mouse-face))
-               (setq end (or (next-single-property-change end 'mouse-face)
-                             (point-max)))
-               (buffer-substring-no-properties beg end)))))
+               (substring-no-properties
+                (get-text-property beg 'completion--string))))))
 
       (unless (buffer-live-p buffer)
         (error "Destination buffer is dead"))
@@ -8998,6 +9100,9 @@ Type \\<completion-list-mode-map>\\[choose-completion] in 
the completion list\
  to select the completion near point.
 Or click to select one with the mouse.
 
+See the `completions-format' user option to control how this
+buffer is formatted.
+
 \\{completion-list-mode-map}")
 
 (defun completion-list-mode-finish ()
@@ -9070,6 +9175,18 @@ select the completion near point.\n\n"))))))
       ;; FIXME: Perhaps this should be done in `minibuffer-completion-help'.
       (when (bobp)
        (next-completion 1)))))
+
+(defun read-expression-switch-to-completions ()
+  "Select the completion list window while reading an expression."
+  (interactive)
+  (completion-help-at-point)
+  (switch-to-completions))
+
+(defun switch-to-minibuffer ()
+  "Select the minibuffer window."
+  (interactive)
+  (when (active-minibuffer-window)
+    (select-window (active-minibuffer-window))))
 
 ;;; Support keyboard commands to turn on various modifiers.
 
diff --git a/lisp/so-long.el b/lisp/so-long.el
index f916b61..d765d34 100644
--- a/lisp/so-long.el
+++ b/lisp/so-long.el
@@ -1648,7 +1648,8 @@ invoking the new action."
     (when so-long--active
       (so-long-revert))
     ;; Invoke the new action.
-    (let ((so-long--calling t))
+    (let ((so-long--calling t)
+          (view-mode-active view-mode))
       (so-long--ensure-enabled)
       ;; ACTION takes precedence if supplied.
       (when action
@@ -1677,7 +1678,10 @@ invoking the new action."
       ;; functions need to modify the buffer.  We use `inhibit-read-only' to
       ;; side-step the issue (and likewise in `so-long-revert').
       (let ((inhibit-read-only t))
-        (run-hooks 'so-long-hook)))))
+        (run-hooks 'so-long-hook))
+      ;; Restore `view-mode'.
+      (when view-mode-active
+        (view-mode)))))
 
 (defun so-long-revert ()
   "Revert the active `so-long-action' and run `so-long-revert-hook'.
diff --git a/lisp/startup.el b/lisp/startup.el
index 3513ab7..456c01e 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -519,7 +519,7 @@ DIRS are relative."
       xdg-dir)
      (t emacs-d-dir))))
 
-(defvar comp-eln-load-path)
+(defvar native-comp-eln-load-path)
 (defun normal-top-level ()
   "Emacs calls this function when it first starts up.
 It sets `command-line-processed', processes the command-line,
@@ -537,22 +537,22 @@ It is the default value of the variable `top-level'."
     (setq user-emacs-directory
          (startup--xdg-or-homedot startup--xdg-config-home-emacs nil))
 
-    (when (featurep 'nativecomp)
-      ;; Form `comp-eln-load-path'.
+    (when (featurep 'native-compile)
+      ;; Form `native-comp-eln-load-path'.
       (let ((path-env (getenv "EMACSNATIVELOADPATH")))
         (when path-env
           (dolist (path (split-string path-env path-separator))
             (unless (string= "" path)
-              (push path comp-eln-load-path)))))
+              (push path native-comp-eln-load-path)))))
       (push (expand-file-name "eln-cache/" user-emacs-directory)
-            comp-eln-load-path)
+            native-comp-eln-load-path)
       ;; When $HOME is set to '/nonexistent' means we are running the
       ;; testsuite, add a temporary folder in front to produce there
       ;; new compilations.
       (when (equal (getenv "HOME") "/nonexistent")
         (let ((tmp-dir (make-temp-file "emacs-testsuite-" t)))
           (add-hook 'kill-emacs-hook (lambda () (delete-directory tmp-dir t)))
-          (push tmp-dir comp-eln-load-path))))
+          (push tmp-dir native-comp-eln-load-path))))
     ;; Look in each dir in load-path for a subdirs.el file.  If we
     ;; find one, load it, which will add the appropriate subdirs of
     ;; that dir into load-path.  This needs to be done before setting
@@ -639,13 +639,13 @@ It is the default value of the variable `top-level'."
                (set pathsym (mapcar (lambda (dir)
                                       (decode-coding-string dir coding t))
                                     path)))))
-        (when (featurep 'nativecomp)
-          (let ((npath (symbol-value 'comp-eln-load-path)))
-            (set 'comp-eln-load-path
+        (when (featurep 'native-compile)
+          (let ((npath (symbol-value 'native-comp-eln-load-path)))
+            (set 'native-comp-eln-load-path
                  (mapcar (lambda (dir)
                            ;; Call expand-file-name to remove all the
                            ;; pesky ".." from the directyory names in
-                           ;; comp-eln-load-path.
+                           ;; native-comp-eln-load-path.
                            (expand-file-name
                             (decode-coding-string dir coding t)))
                          npath))))
@@ -1197,11 +1197,11 @@ please check its value")
 
   ;; Re-evaluate predefined variables whose initial value depends on
   ;; the runtime context.
-  (setq custom-delayed-init-variables
-        ;; Initialize them in the same order they were loaded, in case there
-        ;; are dependencies between them.
-        (nreverse custom-delayed-init-variables))
-  (mapc #'custom-reevaluate-setting custom-delayed-init-variables)
+  (when (listp custom-delayed-init-variables)
+    (mapc #'custom-reevaluate-setting
+          ;; Initialize them in the same order they were loaded, in
+          ;; case there are dependencies between them.
+          (reverse custom-delayed-init-variables)))
   (setq custom-delayed-init-variables t)
 
   ;; Warn for invalid user name.
@@ -2317,6 +2317,9 @@ A fancy display is used on graphic displays, normal 
otherwise."
         (set-buffer-major-mode (current-buffer))
         (current-buffer))))
 
+;; This avoids byte-compiler warning in the unexec build.
+(declare-function pdumper-stats "pdumper.c" ())
+
 (defun command-line-1 (args-left)
   "A subroutine of `command-line'."
   (display-startup-echo-area-message)
@@ -2497,7 +2500,7 @@ nil default-directory" name)
                                    (or argval (pop command-line-args-left))))
                             ;; Take file from default dir if it exists there;
                             ;; otherwise let `load' search for it.
-                            (file-ex (expand-file-name file)))
+                            (file-ex (file-truename (expand-file-name file))))
                        (when (file-regular-p file-ex)
                          (setq file file-ex))
                        (load file nil t)))
@@ -2508,7 +2511,7 @@ nil default-directory" name)
                      (let* ((file (command-line-normalize-file-name
                                    (or argval (pop command-line-args-left))))
                             ;; Take file from default dir.
-                            (file-ex (expand-file-name file)))
+                            (file-ex (file-truename (expand-file-name file))))
                        (load file-ex nil t t)))
 
                     ((equal argi "-insert")
diff --git a/lisp/subr.el b/lisp/subr.el
index 964eb8f..e49c277 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -195,6 +195,14 @@ buffer-local wherever it is set."
   (list 'progn (list 'defvar var val docstring)
         (list 'make-variable-buffer-local (list 'quote var))))
 
+(defun buffer-local-boundp (symbol buffer)
+  "Return non-nil if SYMBOL is bound in BUFFER.
+Also see `local-variable-p'."
+  (condition-case nil
+      (buffer-local-value symbol buffer)
+    (:success t)
+    (void-variable nil)))
+
 (defmacro push (newelt place)
   "Add NEWELT to the list stored in the generalized variable PLACE.
 This is morally equivalent to (setf PLACE (cons NEWELT PLACE)),
@@ -1757,6 +1765,12 @@ be a list of the form returned by `event-start' and 
`event-end'."
 (make-obsolete-variable 'load-dangerous-libraries
                         "no longer used." "27.1")
 
+(defvar inhibit--record-char nil
+  "Obsolete variable.
+This was used internally by quail.el and keyboard.c in Emacs 27.
+It does nothing in Emacs 28.")
+(make-obsolete-variable 'inhibit--record-char nil "28.1")
+
 ;; We can't actually make `values' obsolete, because that will result
 ;; in warnings when using `values' in let-bindings.
 ;;(make-obsolete-variable 'values "no longer used" "28.1")
@@ -1815,9 +1829,15 @@ This makes the hook buffer-local, and it makes t a 
member of the
 buffer-local value.  That acts as a flag to run the hook
 functions of the global value as well as in the local value.
 
-HOOK should be a symbol, and FUNCTION may be any valid function.  If
-HOOK is void, it is first set to nil.  If HOOK's value is a single
-function, it is changed to a list of functions."
+HOOK should be a symbol.  If HOOK is void, it is first set to
+nil.  If HOOK's value is a single function, it is changed to a
+list of functions.
+
+FUNCTION may be any valid function, but it's recommended to use a
+function symbol and not a lambda form.  Using a symbol will
+ensure that the function is not re-added if the function is
+edited, and using lambda forms may also have a negative
+performance impact when running `add-hook' and `remove-hook'."
   (or (boundp hook) (set hook nil))
   (or (default-boundp hook) (set-default hook nil))
   (unless (numberp depth) (setq depth (if depth 90 0)))
@@ -2024,7 +2044,7 @@ FUN is then called once."
 
 (defmacro subr--with-wrapper-hook-no-warnings (hook args &rest body)
   "Like (with-wrapper-hook HOOK ARGS BODY), but without warnings."
-  (declare (debug (form sexp body)))
+  (declare (debug (form sexp def-body)))
   ;; We need those two gensyms because CL's lexical scoping is not available
   ;; for function arguments :-(
   (let ((funs (make-symbol "funs"))
@@ -2464,7 +2484,11 @@ file name without extension.
 If TYPE is nil, then any kind of definition is acceptable.  If
 TYPE is `defun', `defvar', or `defface', that specifies function
 definition, variable definition, or face definition only.
-Otherwise TYPE is assumed to be a symbol property."
+Otherwise TYPE is assumed to be a symbol property.
+
+This function only works for symbols defined in Lisp files.  For
+symbols that are defined in C files, use `help-C-file-name'
+instead."
   (if (and (or (null type) (eq type 'defun))
           (symbolp symbol)
           (autoloadp (symbol-function symbol)))
@@ -3945,7 +3969,7 @@ If you quit, the process is killed with SIGINT, or 
SIGKILL if you quit again."
 Within a `track-mouse' form, mouse motion generates input events that
  you can read with `read-event'.
 Normally, mouse motion is ignored."
-  (declare (debug t) (indent 0))
+  (declare (debug (def-body)) (indent 0))
   `(internal--track-mouse (lambda () ,@body)))
 
 (defmacro with-current-buffer (buffer-or-name &rest body)
@@ -4449,7 +4473,7 @@ change `before-change-functions' or 
`after-change-functions'.
 Additionally, the buffer modifications of BODY are recorded on
 the buffer's undo list as a single \(apply ...) entry containing
 the function `undo--wrap-and-run-primitive-undo'."
-  (declare (debug t) (indent 2))
+  (declare (debug (form form def-body)) (indent 2))
   `(combine-change-calls-1 ,beg ,end (lambda () ,@body)))
 
 (defun undo--wrap-and-run-primitive-undo (beg end list)
@@ -5040,7 +5064,7 @@ See also `with-eval-after-load'."
 FILE is normally a feature name, but it can also be a file name,
 in case that file does not provide any feature.  See `eval-after-load'
 for more details about the different forms of FILE and their semantics."
-  (declare (indent 1) (debug t))
+  (declare (indent 1) (debug (form def-body)))
   `(eval-after-load ,file (lambda () ,@body)))
 
 (defvar after-load-functions nil
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index f3c2fb7..41d565a 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -138,15 +138,12 @@ Possible modifier keys are `control', `meta', `shift', 
`hyper', `super' and
   (when (and (memq 'tab-bar-format-global tab-bar-format)
              (member '(global-mode-string ("" global-mode-string " "))
                      mode-line-misc-info))
-    (setq mode-line-misc-info
-          (append '(global-mode-string
-                    ("" (:eval (if (and tab-bar-mode
-                                        (memq 'tab-bar-format-global
-                                              tab-bar-format))
-                                   "" global-mode-string))
-                     " "))
-                  (remove '(global-mode-string ("" global-mode-string " "))
-                          mode-line-misc-info)))))
+    (setf (alist-get 'global-mode-string mode-line-misc-info)
+          '(("" (:eval (if (and tab-bar-mode
+                                (memq 'tab-bar-format-global
+                                      tab-bar-format))
+                           "" global-mode-string))
+             " ")))))
 
 (defun tab-bar--undefine-keys ()
   "Uninstall key bindings previously bound by `tab-bar--define-keys'."
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index e4521ff..8c6c75e 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -1355,7 +1355,7 @@ This returns an error if any Emacs frames are X frames."
 (declare-function x-get-selection-internal "xselect.c"
                  (selection-symbol target-type &optional time-stamp terminal))
 
-(add-to-list 'display-format-alist '("\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))
+(add-to-list 'display-format-alist '("\\`.*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))
 (cl-defmethod handle-args-function (args &context (window-system x))
   (x-handle-args args))
 
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index eeaf805..8bcae37 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -770,8 +770,7 @@ Can be nil to mean \"no timeout\".")
 By not redisplaying right away for xterm queries, we can avoid
 unsightly flashing during initialization. Give up and redisplay
 anyway if we've been waiting a little while."
-  (let ((start-time (current-time))
-        (inhibit--record-char t))
+  (let ((start-time (current-time)))
     (or (let ((inhibit-redisplay t))
           (read-event nil nil xterm-query-redisplay-timeout))
         (read-event nil nil
@@ -839,8 +838,8 @@ We run the first FUNCTION whose STRING matches the input 
events."
    basemap
    (make-composed-keymap map (keymap-parent basemap))))
 
-(defun terminal-init-xterm ()
-  "Terminal initialization function for xterm."
+(defun xterm--init ()
+  "Initialize the terminal for xterm."
   ;; rxvt terminals sometimes set the TERM variable to "xterm", but
   ;; rxvt's keybindings are incompatible with xterm's. It is
   ;; better in that case to use rxvt's initialization function.
@@ -882,9 +881,18 @@ We run the first FUNCTION whose STRING matches the input 
events."
   ;; support it just ignore the sequence.
   (xterm--init-bracketed-paste-mode)
   ;; We likewise unconditionally enable support for focus tracking.
-  (xterm--init-focus-tracking)
+  (xterm--init-focus-tracking))
 
-  (run-hooks 'terminal-init-xterm-hook))
+(defun terminal-init-xterm ()
+  "Terminal initialization function for xterm."
+  (unwind-protect
+      (progn
+        (xterm--init)
+        ;; If the terminal initialization completed without errors, clear
+        ;; the lossage to discard the responses of the terminal emulator
+        ;; during initialization; otherwise they appear in the recent keys.
+        (clear-this-command-keys))
+    (run-hooks 'terminal-init-xterm-hook)))
 
 (defun xterm--init-modify-other-keys ()
   "Terminal initialization for xterm's modifyOtherKeys support."
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 47b0b51..61a2f6b 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -1307,10 +1307,14 @@ for determining whether point is within a selector."
     (let ((pos (point)))
       (skip-chars-backward "-[:alnum:]")
       (when (eq (char-before) ?\:)
-        (list (point) pos
-              (if (eq (char-before (- (point) 1)) ?\:)
-                  css-pseudo-element-ids
-                css-pseudo-class-ids))))))
+        (let ((double-colon (eq (char-before (- (point) 1)) ?\:)))
+          (list (- (point) (if double-colon 2 1))
+                pos
+                (nconc
+                 (unless double-colon
+                   (mapcar (lambda (id) (concat ":" id)) css-pseudo-class-ids))
+                 (mapcar (lambda (id) (concat "::" id)) 
css-pseudo-element-ids))
+                :company-kind (lambda (_) 'function)))))))
 
 (defun css--complete-at-rule ()
   "Complete at-rule (statement beginning with `@') at point."
@@ -1318,7 +1322,8 @@ for determining whether point is within a selector."
     (let ((pos (point)))
       (skip-chars-backward "-[:alnum:]")
       (when (eq (char-before) ?\@)
-        (list (point) pos css--at-ids)))))
+        (list (point) pos css--at-ids
+              :company-kind (lambda (_) 'keyword))))))
 
 (defvar css--property-value-cache
   (make-hash-table :test 'equal :size (length css-property-alist))
@@ -1366,7 +1371,8 @@ the string PROPERTY."
           (skip-chars-backward "[:graph:]")
           (list (point) end
                 (append '("inherit" "initial" "unset")
-                        (css--property-values (car property)))))))))
+                        (css--property-values (car property)))
+                :company-kind (lambda (_) 'value)))))))
 
 (defvar css--html-tags (mapcar #'car html-tag-alist)
   "List of HTML tags.
@@ -1435,6 +1441,8 @@ tags, classes and IDs."
                     (list prop-beg prop-end)
                   (list sel-beg sel-end))
               ,(completion-table-merge prop-table sel-table)
+              :company-kind
+              ,(lambda (s) (if (test-completion s prop-table) 'property 
'keyword))
               :exit-function
               ,(lambda (string status)
                  (and (eq status 'finished)
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 8d2715f..836d889 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -401,18 +401,12 @@ like <img alt=\"Some thing.\">."
     (let ((f (get-text-property (1- (point)) 'face)))
       (memq f flyspell-prog-text-faces))))
 
-(defvar flyspell--prev-meta-tab-binding nil
-  "Records the binding of M-TAB in effect before flyspell was activated.")
-
 ;;;###autoload
 (defun flyspell-prog-mode ()
   "Turn on `flyspell-mode' for comments and strings."
   (interactive)
   (setq flyspell-generic-check-word-predicate
         #'flyspell-generic-progmode-verify)
-  (setq-local flyspell--prev-meta-tab-binding
-              (or (local-key-binding "\M-\t" t)
-                  (global-key-binding "\M-\t" t)))
   (flyspell-mode 1)
   (run-hooks 'flyspell-prog-mode-hook))
 
@@ -1263,14 +1257,27 @@ spell-check."
                             (t
                              (setq flyspell-word-cache-result nil)
                              ;; Highlight the location as incorrect,
-                             ;; including offset specified in POSS.
+                             ;; including offset specified in POSS
+                             ;; and only for the length of the
+                             ;; misspelled word specified by POSS.
                              (if flyspell-highlight-flag
-                                 (flyspell-highlight-incorrect-region
-                                  (if (and (consp poss)
-                                           (integerp (nth 1 poss)))
-                                      (+ start (nth 1 poss) -1)
-                                    start)
-                                  end poss)
+                                  (let ((hstart start)
+                                        (hend end)
+                                        offset misspelled)
+                                    (when (consp poss)
+                                      (setq misspelled (car poss)
+                                            offset (nth 1 poss))
+                                      (if (integerp offset)
+                                          (setq hstart (+ start offset -1)))
+                                      ;; POSS includes the misspelled
+                                      ;; word; use that to figure out
+                                      ;; how many characters to highlight.
+                                      (if (stringp misspelled)
+                                          (setq hend
+                                                (+ hstart
+                                                   (length misspelled)))))
+                                   (flyspell-highlight-incorrect-region
+                                     hstart hend poss))
                                (flyspell-notify-misspell word poss))
                              nil))))
              ;; return to original location
@@ -1977,15 +1984,14 @@ spell-check."
   (interactive)
   ;; If we are not in the construct where flyspell should be active,
   ;; invoke the original binding of M-TAB, if that was recorded.
-  (if (and (local-variable-p 'flyspell--prev-meta-tab-binding)
-           (commandp flyspell--prev-meta-tab-binding t)
-           (functionp flyspell-generic-check-word-predicate)
-           (not (funcall flyspell-generic-check-word-predicate))
-           (equal (where-is-internal 'flyspell-auto-correct-word nil t)
-                  [?\M-\t]))
-      (call-interactively flyspell--prev-meta-tab-binding)
-    (let ((pos     (point))
-          (old-max (point-max)))
+  (let ((pos     (point))
+        (old-max (point-max))
+        (next-cmd (and (functionp flyspell-generic-check-word-predicate)
+                       (not (funcall flyspell-generic-check-word-predicate))
+                       (let ((flyspell-mode nil))
+                         (key-binding (this-command-keys))))))
+    (if next-cmd
+        (command-execute next-cmd)
       ;; Flush a possibly stale cache from previous invocations of
       ;; flyspell-auto-correct-word/flyspell-auto-correct-previous-word.
       (if (not (memq last-command '(flyspell-auto-correct-word
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 932308e..0a82bf5 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -1076,7 +1076,7 @@ dictionary from that list was found."
           (split-string
            (with-temp-buffer
              (ispell-call-process ispell-program-name
-                            null-device
+                            nil
                             t
                             nil
                             "-D"
@@ -1211,18 +1211,7 @@ If LANG is omitted, get the extra word characters for 
the default language."
                     `(,lang "[[:alpha:]]" "[^[:alpha:]]"
                             ,(ispell--get-extra-word-characters lang) t nil 
nil utf-8))
                   dictionaries)))
-    ;; Merge into FOUND any elements from the standard 
ispell-dictionary-base-alist
-    ;; which have no element in FOUND at all.
-    (dolist (dict ispell-dictionary-base-alist)
-      (unless (assoc (car dict) found)
-       (setq found (nconc found (list dict)))))
-    (setq ispell-enchant-dictionary-alist found)
-    ;; Add a default entry
-    (let ((default-dict
-            `(nil "[[:alpha:]]" "[^[:alpha:]]"
-                  ,(ispell--get-extra-word-characters)
-                  t nil nil utf-8)))
-      (push default-dict ispell-enchant-dictionary-alist))))
+    (setq ispell-enchant-dictionary-alist found)))
 
 ;; Set params according to the selected spellchecker
 
@@ -1245,7 +1234,7 @@ aspell is used along with Emacs).")
 
 (defun ispell-set-spellchecker-params ()
   "Initialize some spellchecker parameters when changed or first used."
-  (unless (eq ispell-last-program-name ispell-program-name)
+  (unless (equal ispell-last-program-name ispell-program-name)
     (ispell-kill-ispell t)
     (if (and (condition-case ()
                 (progn
@@ -1765,10 +1754,12 @@ You can set this variable in hooks in your init file -- 
eg:
 If asynchronous subprocesses are not supported, call function `ispell-filter'
 and pass it the output of the last Ispell invocation."
   (if ispell-async-processp
-      (let ((timeout (if timeout-msecs
-                        (+ (or timeout-secs 0) (/ timeout-msecs 1000.0))
-                      timeout-secs)))
-       (accept-process-output ispell-process timeout))
+      (if (process-live-p ispell-process)
+       (let ((timeout (if timeout-msecs
+                         (+ (or timeout-secs 0) (/ timeout-msecs 1000.0))
+                       timeout-secs)))
+        (accept-process-output ispell-process timeout))
+       (error "No Ispell process to read output from!"))
     (if (null ispell-process)
        (error "No Ispell process to read output from!")
       (let ((buf ispell-output-buffer)
@@ -1793,7 +1784,8 @@ Only works for Aspell and Enchant."
 (defun ispell-send-string (string)
   "Send the string STRING to the Ispell process."
   (if ispell-async-processp
-      (process-send-string ispell-process string)
+      (if (process-live-p ispell-process)
+       (process-send-string ispell-process string))
     ;; Asynchronous subprocesses aren't supported on this losing system.
     ;; We keep all the directives passed to Ispell during the entire
     ;; session in a buffer, and pass them anew each time we invoke
diff --git a/lisp/textmodes/makeinfo.el b/lisp/textmodes/makeinfo.el
index 653540a..13367a0 100644
--- a/lisp/textmodes/makeinfo.el
+++ b/lisp/textmodes/makeinfo.el
@@ -85,6 +85,7 @@ the proper way to specify those is with the Texinfo commands
 
 ;;; The `makeinfo' function definitions
 
+;;;###autoload
 (defun makeinfo-region (region-beginning region-end)
   "Make Info file from region of current Texinfo file, and switch to it.
 
@@ -222,6 +223,7 @@ nonsensical results."
         (match-string 1)
       "Top")))
 
+;;;###autoload
 (defun makeinfo-buffer ()
   "Make Info file from current buffer.
 
@@ -266,6 +268,7 @@ Use the \\[next-error] command to move to the next error
       (Info-revert-find-node
        makeinfo-output-file-name makeinfo-output-node-name))))
 
+;;;###autoload
 (defun makeinfo-recenter-compilation-buffer (linenum)
   "Redisplay `*compilation*' buffer so most recent output can be seen.
 The last line of the buffer is displayed on
@@ -286,4 +289,8 @@ line LINE of the window, or centered if LINE is nil."
 
 (provide 'makeinfo)
 
+;; Local Variables:
+;; generated-autoload-file: "texinfo-loaddefs.el"
+;; End:
+
 ;;; makeinfo.el ends here
diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el
index 0d6bfb5..96065ee 100644
--- a/lisp/textmodes/reftex-vars.el
+++ b/lisp/textmodes/reftex-vars.el
@@ -121,7 +121,7 @@
        (regexp "tables?" "tab\\." "Tabellen?"))
       ("table*"    ?t nil nil caption)
 
-      ("\\footnote[]{}" ?n "fn:" "~\\ref{%s}" 2
+      ("\\footnote[]{}" ?n "fn:" "~\\footref{%s}" 2
        (regexp "footnotes?" "Fussnoten?"))
 
       ("any"       ?\  " "   "~\\ref{%s}" nil)
@@ -1059,7 +1059,7 @@ This is used to string together whole reference sets, like
 
 (defcustom reftex-ref-style-alist
   '(("Default" t
-     (("\\ref" ?\C-m) ("\\Ref" ?R) ("\\pageref" ?p)))
+     (("\\ref" ?\C-m) ("\\Ref" ?R) ("\\footref" ?n) ("\\pageref" ?p)))
     ("Varioref" "varioref"
      (("\\vref" ?v) ("\\Vref" ?V) ("\\vpageref" ?g)))
     ("Fancyref" "fancyref"
@@ -1079,7 +1079,7 @@ the macro type is being prompted for.  (See also
 `reftex-ref-macro-prompt'.)  The keys, represented as characters,
 have to be unique."
   :group 'reftex-referencing-labels
-  :version "27.1"
+  :version "28.1"
   :type '(alist :key-type (string :tag "Style name")
                :value-type (group (choice :tag "Package"
                                           (const :tag "Any package" t)
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index d5930e8..fda00ec 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -190,8 +190,19 @@ This takes effect when first loading the `sgml-mode' 
library.")
   "Syntax table used in SGML mode.  See also `sgml-specials'.")
 
 (defconst sgml-tag-syntax-table
-  (let ((table (sgml-make-syntax-table sgml-specials)))
-    (dolist (char '(?\( ?\) ?\{ ?\} ?\[ ?\] ?$ ?% ?& ?* ?+ ?/))
+  (let ((table (sgml-make-syntax-table sgml-specials))
+       brackets)
+    (map-char-table
+     (lambda (key value)
+       (setq brackets (cons (list
+                            (if (consp key)
+                                (list (car key) (cdr key))
+                              key)
+                            value)
+                           brackets)))
+     (unicode-property-table-internal 'paired-bracket))
+    (setq brackets (delete-dups (flatten-tree brackets)))
+    (dolist (char (append brackets (list ?$ ?% ?& ?* ?+ ?/)))
       (modify-syntax-entry char "." table))
     (unless (memq ?' sgml-specials)
       ;; Avoid that skipping a tag backwards skips any "'" prefixing it.
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index 8d7f459..8b8108c 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -599,11 +599,13 @@ An alternative value is \" . \", if you use a font with a 
narrow period."
        ;; Citation args.
        (list (concat slash citations opt arg) 3 'font-lock-constant-face)
        ;;
-       ;; Text between `` quotes ''.
-       (cons (concat (regexp-opt '("``" "\"<" "\"`" "<<" "«") t)
-                     "[^'\">{]+"       ;a bit pessimistic
-                     (regexp-opt '("''" "\">" "\"'" ">>" "»") t))
-             'font-lock-string-face)
+        ;; Text between `` quotes ''.
+        (list (concat (regexp-opt '("``" "\"<" "\"`" "<<" "«") t)
+                      "\\(\\(.\\|\n\\)+?\\)"
+                      (regexp-opt `("''" "\">" "\"'" ">>" "»") t))
+              '(1 font-lock-keyword-face)
+              '(2 font-lock-string-face)
+              '(4 font-lock-keyword-face))
        ;;
        ;; Command names, special and general.
        (cons (concat slash specials-1) 'font-lock-warning-face)
@@ -2130,6 +2132,7 @@ If NOT-ALL is non-nil, save the `.dvi' file."
 (defvar tex-compile-commands
   `(,@(mapcar (lambda (prefix)
                 `((concat ,prefix tex-command
+                          " " tex-start-options
                           " " (if (< 0 (length tex-start-commands))
                                   (shell-quote-argument tex-start-commands))
                           " %f")
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index 750a33d..11d60e1 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -69,202 +69,12 @@
 
 ;;; Autoloads:
 
-(autoload 'makeinfo-region
-  "makeinfo"
-  "Make Info file from region of current Texinfo file, and switch to it.
-
-This command does not offer the `next-error' feature since it would
-apply to a temporary file, not the original; use the `makeinfo-buffer'
-command to gain use of `next-error'."
-  t nil)
-
-(autoload 'makeinfo-buffer
-  "makeinfo"
-  "Make Info file from current buffer.
-
-Use the \\[next-error] command to move to the next error
-\(if there are errors)."
-  t nil)
-
 (autoload 'kill-compilation
   "compile"
   "Kill the process made by the \\[compile] command."
   t nil)
 
-(autoload 'makeinfo-recenter-compilation-buffer
-  "makeinfo"
-  "Redisplay `*compilation*' buffer so most recent output can be seen.
-The last line of the buffer is displayed on
-line LINE of the window, or centered if LINE is nil."
-  t nil)
-
-(autoload 'texinfo-update-node
-  "texnfo-upd"
-  "Without any prefix argument, update the node in which point is located.
-Non-nil argument (prefix, if interactive) means update the nodes in the
-marked region.
-
-The functions for creating or updating nodes and menus, and their
-keybindings, are:
-
-    `texinfo-update-node' (&optional region-p)    \\[texinfo-update-node]
-    `texinfo-every-node-update' ()                \\[texinfo-every-node-update]
-    `texinfo-sequential-node-update' (&optional region-p)
-
-    `texinfo-make-menu' (&optional region-p)      \\[texinfo-make-menu]
-    `texinfo-all-menus-update' ()                 \\[texinfo-all-menus-update]
-    `texinfo-master-menu' ()
-
-    `texinfo-indent-menu-description' (column &optional region-p)
-
-The `texinfo-column-for-description' variable specifies the column to
-which menu descriptions are indented. Its default value is 32."
-  t nil)
-
-(autoload 'texinfo-every-node-update
-  "texnfo-upd"
-  "Update every node in a Texinfo file."
-  t nil)
-
-(autoload 'texinfo-sequential-node-update
-  "texnfo-upd"
-  "Update one node (or many) in a Texinfo file with sequential pointers.
-
-This function causes the `Next' or `Previous' pointer to point to the
-immediately preceding or following node, even if it is at a higher or
-lower hierarchical level in the document.  Continually pressing `n' or
-`p' takes you straight through the file.
-
-Without any prefix argument, update the node in which point is located.
-Non-nil argument (prefix, if interactive) means update the nodes in the
-marked region.
-
-This command makes it awkward to navigate among sections and
-subsections; it should be used only for those documents that are meant
-to be read like a novel rather than a reference, and for which the
-Info `g*' command is inadequate."
-  t nil)
-
-(autoload 'texinfo-make-menu
-  "texnfo-upd"
-  "Without any prefix argument, make or update a menu.
-Make the menu for the section enclosing the node found following point.
-
-Non-nil argument (prefix, if interactive) means make or update menus
-for nodes within or part of the marked region.
-
-Whenever a menu exists, and is being updated, the descriptions that
-are associated with node names in the pre-existing menu are
-incorporated into the new menu.  Otherwise, the nodes' section titles
-are inserted as descriptions."
-  t nil)
-
-(autoload 'texinfo-all-menus-update
-  "texnfo-upd"
-  "Update every regular menu in a Texinfo file.
-Remove pre-existing master menu, if there is one.
-
-If called with a non-nil argument, this function first updates all the
-nodes in the buffer before updating the menus."
-  t nil)
-
-(autoload 'texinfo-master-menu
-  "texnfo-upd"
-  "Make a master menu for a whole Texinfo file.
-Non-nil argument (prefix, if interactive) means first update all
-existing nodes and menus.  Remove pre-existing master menu, if there is one.
-
-This function creates a master menu that follows the top node.  The
-master menu includes every entry from all the other menus.  It
-replaces any existing ordinary menu that follows the top node.
-
-If called with a non-nil argument, this function first updates all the
-menus in the buffer (incorporating descriptions from pre-existing
-menus) before it constructs the master menu.
-
-The function removes the detailed part of an already existing master
-menu.  This action depends on the pre-existing master menu using the
-standard `texinfo-master-menu-header'.
-
-The master menu has the following format, which is adapted from the
-recommendation in the Texinfo Manual:
-
-   * The first part contains the major nodes in the Texinfo file: the
-     nodes for the chapters, chapter-like sections, and the major
-     appendices.  This includes the indices, so long as they are in
-     chapter-like sections, such as unnumbered sections.
-
-   * The second and subsequent parts contain a listing of the other,
-     lower level menus, in order.  This way, an inquirer can go
-     directly to a particular node if he or she is searching for
-     specific information.
-
-Each of the menus in the detailed node listing is introduced by the
-title of the section containing the menu."
-  t nil)
-
-(autoload 'texinfo-indent-menu-description
-  "texnfo-upd"
-  "Indent every description in menu following point to COLUMN.
-Non-nil argument (prefix, if interactive) means indent every
-description in every menu in the region.  Does not indent second and
-subsequent lines of a multi-line description."
-  t nil)
-
-(autoload 'texinfo-insert-node-lines
-  "texnfo-upd"
-  "Insert missing `@node' lines in region of Texinfo file.
-Non-nil argument (prefix, if interactive) means also to insert the
-section titles as node names; and also to insert the section titles as
-node names in pre-existing @node lines that lack names."
-  t nil)
-
-(autoload 'texinfo-start-menu-description
-  "texnfo-upd"
-  "In this menu entry, insert the node's section title as a description.
-Position point at beginning of description ready for editing.
-Do not insert a title if the line contains an existing description.
-
-You will need to edit the inserted text since a useful description
-complements the node name rather than repeats it as a title does."
-  t nil)
-
-(autoload 'texinfo-multiple-files-update
-  "texnfo-upd"
-  "Update first node pointers in each file included in OUTER-FILE;
-create or update main menu in the outer file that refers to such nodes.
-This does not create or update menus or pointers within the included files.
-
-With optional MAKE-MASTER-MENU argument (prefix arg, if interactive),
-insert a master menu in OUTER-FILE.  This does not create or update
-menus or pointers within the included files.
-
-With optional UPDATE-EVERYTHING argument (numeric prefix arg, if
-interactive), update all the menus and all the `Next', `Previous', and
-`Up' pointers of all the files included in OUTER-FILE before inserting
-a master menu in OUTER-FILE.
-
-The command also updates the `Top' level node pointers of OUTER-FILE.
-
-Notes:
-
-  * this command does NOT save any files--you must save the
-    outer file and any modified, included files.
-
-  * except for the `Top' node, this command does NOT handle any
-    pre-existing nodes in the outer file; hence, indices must be
-    enclosed in an included file.
-
-Requirements:
-
-  * each of the included files must contain exactly one highest
-    hierarchical level node,
-  * this highest node must be the first node in the included file,
-  * each highest hierarchical level node must be of the same type.
-
-Thus, normally, each included file contains one, and only one,
-chapter."
-  t nil)
+(require 'texinfo-loaddefs)
 
 
 ;;; Code:
diff --git a/lisp/textmodes/texnfo-upd.el b/lisp/textmodes/texnfo-upd.el
index 0300454..f56f197 100644
--- a/lisp/textmodes/texnfo-upd.el
+++ b/lisp/textmodes/texnfo-upd.el
@@ -275,6 +275,7 @@ The keys are strings specifying the general hierarchical 
level in the
 document; the values are regular expressions.")
 
 
+;;;###autoload
 (defun texinfo-make-menu (&optional beginning end)
   "Without any prefix argument, make or update a menu.
 Make the menu for the section enclosing the node found following point.
@@ -351,6 +352,7 @@ at the level specified by LEVEL.  Point is left at the end 
of menu."
       (texinfo-delete-old-menu beginning first))
     (texinfo-insert-menu new-menu-list node-name)))
 
+;;;###autoload
 (defun texinfo-all-menus-update (&optional update-all-nodes-p)
   "Update every regular menu in a Texinfo file.
 Update pre-existing master menu, if there is one.
@@ -733,6 +735,7 @@ is the menu entry name, and the cdr of P is the node name."
 
 ;;; Starting menu descriptions by inserting titles
 
+;;;###autoload
 (defun texinfo-start-menu-description ()
   "In this menu entry, insert the node's section title as a description.
 Position point at beginning of description ready for editing.
@@ -817,6 +820,7 @@ complements the node name rather than repeats it as a title 
does."
 ;; Since the make-menu functions indent descriptions, these functions
 ;; are useful primarily for indenting a single menu specially.
 
+;;;###autoload
 (defun texinfo-indent-menu-description (column &optional region-p)
   "Indent every description in menu following point to COLUMN.
 Non-nil argument (prefix, if interactive) means indent every
@@ -872,6 +876,7 @@ second and subsequent lines of a multi-line description."
 
 ;;; Making the master menu
 
+;;;###autoload
 (defun texinfo-master-menu (update-all-nodes-menus-p)
   "Make a master menu for a whole Texinfo file.
 Remove pre-existing master menu, if there is one.
@@ -1266,6 +1271,7 @@ end of that region; it limits the search."
 
 ;;; Updating a node
 
+;;;###autoload
 (defun texinfo-update-node (&optional beginning end)
   "Without any prefix argument, update the node in which point is located.
 Interactively, a prefix argument means to operate on the region.
@@ -1313,6 +1319,7 @@ which menu descriptions are indented. Its default value 
is 32."
          (goto-char (point-max))
          (message "Done...nodes updated in region.  You may save the 
buffer."))))))
 
+;;;###autoload
 (defun texinfo-every-node-update ()
   "Update every node in a Texinfo file.
 
@@ -1553,6 +1560,7 @@ towards which the pointer is directed, one of `next', 
`previous', or `up'."
 ;; (The subsection to which `Next' points will most likely be the first
 ;; item on the section's menu.)
 
+;;;###autoload
 (defun texinfo-sequential-node-update (&optional region-p)
   "Update one node (or many) in a Texinfo file with sequential pointers.
 
@@ -1676,6 +1684,7 @@ or `Up' pointer."
 ;; before the `@chapter', `@section', and such like lines of a region
 ;; in a Texinfo file.
 
+;;;###autoload
 (defun texinfo-insert-node-lines (beginning end &optional title-p)
   "Insert missing `@node' lines in region of Texinfo file.
 Non-nil argument (prefix, if interactive) means also to insert the
@@ -1989,6 +1998,7 @@ be the files included within it.  A main menu must 
already exist."
 
 ;;; The multiple-file update function
 
+;;;###autoload
 (defun texinfo-multiple-files-update
   (outer-file &optional make-master-menu update-everything)
   "Update first node pointers in each file included in OUTER-FILE;
@@ -2114,4 +2124,8 @@ chapter."
 
 (provide 'texnfo-upd)
 
+;; Local Variables:
+;; generated-autoload-file: "texinfo-loaddefs.el"
+;; End:
+
 ;;; texnfo-upd.el ends here
diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el
index ffeb9e6..74c6d41 100644
--- a/lisp/textmodes/text-mode.el
+++ b/lisp/textmodes/text-mode.el
@@ -49,7 +49,7 @@
     (modify-syntax-entry ?' "w p" st)
     ;; UAX #29 says HEBREW PUNCTUATION GERESH behaves like a letter
     ;; for the purposes of finding word boundaries.
-    (modify-syntax-entry #x5f3 "w   ") ; GERESH
+    (modify-syntax-entry #x5f3 "w   " st) ; GERESH
     ;; UAX #29 says HEBREW PUNCTUATION GERSHAYIM should not be a word
     ;; boundary when surrounded by letters.  Our infrastructure for
     ;; finding a word boundary doesn't support 3-character
@@ -57,13 +57,13 @@
     ;; character.  This leaves a problem of having GERSHAYIM at the
     ;; beginning or end of a word, where it should be a boundary;
     ;; FIXME.
-    (modify-syntax-entry #x5f4 "w   ") ; GERSHAYIM
+    (modify-syntax-entry #x5f4 "w   " st) ; GERSHAYIM
     ;; These all should not be a word boundary when between letters,
     ;; according to UAX #29, so they again are prone to the same
     ;; problem as GERSHAYIM; FIXME.
-    (modify-syntax-entry #xb7 "w   ")  ; MIDDLE DOT
-    (modify-syntax-entry #x2027 "w   ")        ; HYPHENATION POINT
-    (modify-syntax-entry #xff1a "w   ")        ; FULLWIDTH COLON
+    (modify-syntax-entry #xb7 "w   " st)   ; MIDDLE DOT
+    (modify-syntax-entry #x2027 "w   " st) ; HYPHENATION POINT
+    (modify-syntax-entry #xff1a "w   " st) ; FULLWIDTH COLON
     st)
   "Syntax table used while in `text-mode'.")
 
diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el
index b9eab95..ae91171 100644
--- a/lisp/time-stamp.el
+++ b/lisp/time-stamp.el
@@ -25,7 +25,7 @@
 
 ;; A template in a file can be updated with a new time stamp when
 ;; you save the file.  For example:
-;;     static char *ts = "sdmain.c Time-stamp: <2001-08-13 10:20:51 gildea>";
+;;     static char *ts = "sdmain.c Time-stamp: <2020-04-18 14:10:21 gildea>";
 
 ;; To use time-stamping, add this line to your init file:
 ;;     (add-hook 'before-save-hook 'time-stamp)
@@ -278,7 +278,7 @@ look like one of the following:
       Time-stamp: <>
       Time-stamp: \" \"
 The time stamp is written between the brackets or quotes:
-      Time-stamp: <2001-02-18 10:20:51 gildea>
+      Time-stamp: <2020-08-07 17:10:21 gildea>
 
 The time stamp is updated only if the variable
 `time-stamp-active' is non-nil.
@@ -422,7 +422,7 @@ Returns the end point, which is where `time-stamp' begins 
the next search."
 ;;;###autoload
 (defun time-stamp-toggle-active (&optional arg)
   "Toggle `time-stamp-active', setting whether \\[time-stamp] updates a buffer.
-With ARG, turn time stamping on if and only if arg is positive."
+With ARG, turn time stamping on if and only if ARG is positive."
   (interactive "P")
   (setq time-stamp-active
        (if (null arg)
@@ -457,200 +457,225 @@ normally the current time is used."
 (defun time-stamp-string-preprocess (format &optional time)
   "Use a FORMAT to format date, time, file, and user information.
 Optional second argument TIME is only for testing.
-Implements non-time extensions to `format-time-string'
+Implements extensions to `format-time-string'
 and all `time-stamp-format' compatibility."
   (let ((fmt-len (length format))
        (ind 0)
        cur-char
-       (prev-char nil)
-       (result "")
-       field-width
-       field-result
-       alt-form change-case upcase
-       (paren-level 0))
+       (result ""))
     (while (< ind fmt-len)
       (setq cur-char (aref format ind))
       (setq
        result
-       (concat result
-      (cond
-       ((eq cur-char ?%)
-       ;; eat any additional args to allow for future expansion
-       (setq alt-form 0 change-case nil upcase nil field-width "")
-       (while (progn
-                (setq ind (1+ ind))
-                (setq cur-char (if (< ind fmt-len)
-                                   (aref format ind)
-                                 ?\0))
-                (or (eq ?. cur-char)
-                    (eq ?, cur-char) (eq ?: cur-char) (eq ?@ cur-char)
-                    (eq ?- cur-char) (eq ?+ cur-char) (eq ?_ cur-char)
-                    (eq ?\s cur-char) (eq ?# cur-char) (eq ?^ cur-char)
-                    (and (eq ?\( cur-char)
-                         (not (eq prev-char ?\\))
-                         (setq paren-level (1+ paren-level)))
-                    (if (and (eq ?\) cur-char)
+       (concat
+        result
+        (cond
+         ((eq cur-char ?%)
+         (let ((prev-char nil)
+               (field-width "")
+               field-result
+               (alt-form 0)
+               (change-case nil)
+               (upcase nil)
+               (flag-pad-with-spaces nil)
+               (flag-pad-with-zeros nil)
+               (flag-minimize nil)
+               (paren-level 0))
+           ;; eat any additional args to allow for future expansion
+           (while (progn
+                    (setq ind (1+ ind))
+                    (setq cur-char (if (< ind fmt-len)
+                                       (aref format ind)
+                                     ?\0))
+                    (or (eq ?. cur-char)
+                        (eq ?, cur-char) (eq ?: cur-char) (eq ?@ cur-char)
+                        (eq ?- cur-char) (eq ?+ cur-char) (eq ?_ cur-char)
+                        (eq ?\s cur-char) (eq ?# cur-char) (eq ?^ cur-char)
+                        (and (eq ?\( cur-char)
                              (not (eq prev-char ?\\))
-                             (> paren-level 0))
-                        (setq paren-level (1- paren-level))
-                      (and (> paren-level 0)
-                           (< ind fmt-len)))
-                    (if (and (<= ?0 cur-char) (>= ?9 cur-char))
-                        ;; get format width
-                        (let ((field-index ind))
-                          (while (progn
-                                   (setq ind (1+ ind))
-                                   (setq cur-char (if (< ind fmt-len)
-                                                      (aref format ind)
-                                                    ?\0))
-                                   (and (<= ?0 cur-char) (>= ?9 cur-char))))
-                          (setq field-width (substring format field-index ind))
-                          (setq ind (1- ind))
-                          t))))
-         (setq prev-char cur-char)
-         ;; some characters we actually use
-         (cond ((eq cur-char ?:)
-                (setq alt-form (1+ alt-form)))
-               ((eq cur-char ?#)
-                (setq change-case t))
-               ((eq cur-char ?^)
-                (setq upcase t))
-               ((eq cur-char ?-)
-                (setq field-width "1"))
-               ((eq cur-char ?_)
-                (setq field-width "2"))))
-       (setq field-result
-       (cond
-        ((eq cur-char ?%)
-         "%")
-        ((eq cur-char ?a)              ;day of week
-          (if (> alt-form 0)
-               (if (string-equal field-width "")
-                   (time-stamp--format "%A" time)
-                 "")                   ;discourage "%:3a"
-            (if (or change-case upcase)
-                (time-stamp--format "%#a" time)
-             (time-stamp--format "%a" time))))
-        ((eq cur-char ?A)
-         (if (or change-case upcase (not (string-equal field-width "")))
-             (time-stamp--format "%#A" time)
-           (time-stamp--format "%A" time)))
-        ((eq cur-char ?b)              ;month name
-          (if (> alt-form 0)
-               (if (string-equal field-width "")
-                   (time-stamp--format "%B" time)
-                 "")                   ;discourage "%:3b"
-            (if (or change-case upcase)
-                (time-stamp--format "%#b" time)
-             (time-stamp--format "%b" time))))
-        ((eq cur-char ?B)
-         (if (or change-case upcase (not (string-equal field-width "")))
-             (time-stamp--format "%#B" time)
-           (time-stamp--format "%B" time)))
-        ((eq cur-char ?d)              ;day of month, 1-31
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?H)              ;hour, 0-23
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?I)              ;hour, 1-12
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?m)              ;month number, 1-12
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?M)              ;minute, 0-59
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?p)              ;am or pm
-         (if change-case
-              (time-stamp--format "%#p" time)
-            (time-stamp--format "%p" time)))
-        ((eq cur-char ?P)              ;AM or PM
-         (time-stamp--format "%p" time))
-        ((eq cur-char ?S)              ;seconds, 00-60
-         (time-stamp-do-number cur-char alt-form field-width time))
-        ((eq cur-char ?w)              ;weekday number, Sunday is 0
-         (time-stamp--format "%w" time))
-        ((eq cur-char ?y)              ;year
-          (if (> alt-form 0)
-              (string-to-number (time-stamp--format "%Y" time))
-            (if (or (string-equal field-width "")
-                    (<= (string-to-number field-width) 2))
-                (string-to-number (time-stamp--format "%y" time))
-              (time-stamp-conv-warn (format "%%%sy" field-width) "%Y")
-              (string-to-number (time-stamp--format "%Y" time)))))
-        ((eq cur-char ?Y)              ;4-digit year
-         (string-to-number (time-stamp--format "%Y" time)))
-        ((eq cur-char ?z)              ;time zone offset
-         (if change-case
-             ""                        ;discourage %z variations
-            (cond ((= alt-form 0)
-                   (if (string-equal field-width "")
-                       (progn
-                         (time-stamp-conv-warn "%z" "%#Z")
-                         (time-stamp--format "%#Z" time))
-                     (cond ((string-equal field-width "1")
-                            (setq field-width "3")) ;%-z -> "+00"
-                           ((string-equal field-width "2")
-                            (setq field-width "5")) ;%_z -> "+0000"
-                           ((string-equal field-width "4")
-                            (setq field-width "0"))) ;discourage %4z
-                     (time-stamp--format "%z" time)))
-                  ((= alt-form 1)
-                   (time-stamp--format "%:z" time))
-                  ((= alt-form 2)
-                   (time-stamp--format "%::z" time))
-                  ((= alt-form 3)
-                   (time-stamp--format "%:::z" time)))))
-        ((eq cur-char ?Z)              ;time zone name
-         (if change-case
-             (time-stamp--format "%#Z" time)
-           (time-stamp--format "%Z" time)))
-        ((eq cur-char ?f)              ;buffer-file-name, base name only
-         (if buffer-file-name
-             (file-name-nondirectory buffer-file-name)
-           time-stamp-no-file))
-        ((eq cur-char ?F)              ;buffer-file-name, full path
-         (or buffer-file-name
-             time-stamp-no-file))
-        ((eq cur-char ?s)              ;system name, legacy
-         (system-name))
-        ((eq cur-char ?u)              ;user name, legacy
-         (user-login-name))
-        ((eq cur-char ?U)              ;user full name, legacy
-         (user-full-name))
-        ((eq cur-char ?l)              ;login name
-         (user-login-name))
-        ((eq cur-char ?L)              ;full name of logged-in user
-         (user-full-name))
-        ((eq cur-char ?h)              ;mail host name
-         (or mail-host-address (system-name)))
-        ((eq cur-char ?q)              ;unqualified host name
-         (let ((qualname (system-name)))
-           (if (string-match "\\." qualname)
-               (substring qualname 0 (match-beginning 0))
-             qualname)))
-        ((eq cur-char ?Q)              ;fully-qualified host name
-         (system-name))
-        ))
-        (and (numberp field-result)
-             (= alt-form 0)
-             (string-equal field-width "")
-             ;; no width provided; set width for default
-             (setq field-width "02"))
-       (let ((padded-result
-              (format (format "%%%s%c"
-                              field-width
-                              (if (numberp field-result) ?d ?s))
-                      (or field-result ""))))
-         (let* ((initial-length (length padded-result))
-                (desired-length (if (string-equal field-width "")
-                                    initial-length
-                                  (string-to-number field-width))))
-           (if (> initial-length desired-length)
-               ;; truncate strings on right
-               (if (stringp field-result)
-                   (substring padded-result 0 desired-length)
-                  padded-result)       ;numbers don't truncate
-             padded-result))))
-       (t
-       (char-to-string cur-char)))))
+                             (setq paren-level (1+ paren-level)))
+                        (if (and (eq ?\) cur-char)
+                                 (not (eq prev-char ?\\))
+                                 (> paren-level 0))
+                            (setq paren-level (1- paren-level))
+                          (and (> paren-level 0)
+                               (< ind fmt-len)))
+                        (if (and (<= ?0 cur-char) (>= ?9 cur-char))
+                            ;; get format width
+                            (let ((field-index ind)
+                                  (first-digit cur-char))
+                              (while (progn
+                                       (setq ind (1+ ind))
+                                       (setq cur-char (if (< ind fmt-len)
+                                                          (aref format ind)
+                                                        ?\0))
+                                       (and (<= ?0 cur-char)
+                                            (>= ?9 cur-char))))
+                              (setq field-width
+                                    (substring format field-index ind))
+                              (setq ind (1- ind))
+                              (setq cur-char first-digit)
+                              t))))
+             (setq prev-char cur-char)
+             ;; some characters we actually use
+             (cond ((eq cur-char ?:)
+                    (setq alt-form (1+ alt-form)))
+                   ((eq cur-char ?#)
+                    (setq change-case t))
+                   ((eq cur-char ?^)
+                    (setq upcase t))
+                   ((eq cur-char ?0)
+                    (setq flag-pad-with-zeros t))
+                   ((eq cur-char ?-)
+                    (setq field-width "1" flag-minimize t))
+                   ((eq cur-char ?_)
+                    (setq field-width "2" flag-pad-with-spaces t))))
+           (setq field-result
+                 (cond
+                  ((eq cur-char ?%)
+                   "%")
+                  ((eq cur-char ?a)    ;day of week
+                    (if (> alt-form 0)
+                        (if (string-equal field-width "")
+                            (time-stamp--format "%A" time)
+                          "")           ;discourage "%:3a"
+                      (if (or change-case upcase)
+                          (time-stamp--format "%#a" time)
+                       (time-stamp--format "%a" time))))
+                  ((eq cur-char ?A)
+                   (if (or change-case upcase (not (string-equal field-width
+                                                                 "")))
+                       (time-stamp--format "%#A" time)
+                     (time-stamp--format "%A" time)))
+                  ((eq cur-char ?b)    ;month name
+                    (if (> alt-form 0)
+                        (if (string-equal field-width "")
+                            (time-stamp--format "%B" time)
+                          "")           ;discourage "%:3b"
+                      (if (or change-case upcase)
+                          (time-stamp--format "%#b" time)
+                       (time-stamp--format "%b" time))))
+                  ((eq cur-char ?B)
+                   (if (or change-case upcase (not (string-equal field-width
+                                                                 "")))
+                       (time-stamp--format "%#B" time)
+                     (time-stamp--format "%B" time)))
+                  ((eq cur-char ?d)    ;day of month, 1-31
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?H)    ;hour, 0-23
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?I)    ;hour, 1-12
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?m)    ;month number, 1-12
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?M)    ;minute, 0-59
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?p)    ;am or pm
+                   (if change-case
+                        (time-stamp--format "%#p" time)
+                      (time-stamp--format "%p" time)))
+                  ((eq cur-char ?P)    ;AM or PM
+                   (time-stamp--format "%p" time))
+                  ((eq cur-char ?S)    ;seconds, 00-60
+                   (time-stamp-do-number cur-char alt-form field-width time))
+                  ((eq cur-char ?w)    ;weekday number, Sunday is 0
+                   (time-stamp--format "%w" time))
+                  ((eq cur-char ?y)    ;year
+                    (if (> alt-form 0)
+                        (string-to-number (time-stamp--format "%Y" time))
+                      (if (or (string-equal field-width "")
+                              (<= (string-to-number field-width) 2))
+                          (string-to-number (time-stamp--format "%y" time))
+                        (time-stamp-conv-warn (format "%%%sy" field-width) 
"%Y")
+                        (string-to-number (time-stamp--format "%Y" time)))))
+                  ((eq cur-char ?Y)    ;4-digit year
+                   (string-to-number (time-stamp--format "%Y" time)))
+                  ((eq cur-char ?z)    ;time zone offset
+                    (let ((field-width-num (string-to-number field-width))
+                          ;; Handle numeric time zone ourselves, because
+                          ;; current-time-zone cannot handle offsets
+                          ;; greater than 24 hours.
+                          (offset-secs
+                           (cond ((numberp time-stamp-time-zone)
+                                  time-stamp-time-zone)
+                                 ((and (consp time-stamp-time-zone)
+                                       (numberp (car time-stamp-time-zone)))
+                                  (car time-stamp-time-zone))
+                                 ;; interpret text time zone
+                                 (t (car (current-time-zone
+                                          time time-stamp-time-zone))))))
+                     ;; we do our own padding; do not let it be updated further
+                     (setq field-width "")
+                     (cond (change-case
+                            "")        ;discourage %z variations
+                           ((and (= alt-form 0)
+                                 (not flag-minimize)
+                                 (not flag-pad-with-spaces)
+                                 (not flag-pad-with-zeros)
+                                 (= field-width-num 0))
+                            (time-stamp-conv-warn "%z" "%#Z")
+                            (time-stamp--format "%#Z" time))
+                           (t (time-stamp-formatz-from-parsed-options
+                               flag-minimize
+                               flag-pad-with-spaces
+                               flag-pad-with-zeros
+                               alt-form
+                               field-width-num
+                               offset-secs)))))
+                  ((eq cur-char ?Z)    ;time zone name
+                   (if change-case
+                       (time-stamp--format "%#Z" time)
+                     (time-stamp--format "%Z" time)))
+                  ((eq cur-char ?f)    ;buffer-file-name, base name only
+                   (if buffer-file-name
+                       (file-name-nondirectory buffer-file-name)
+                     time-stamp-no-file))
+                  ((eq cur-char ?F)    ;buffer-file-name, full path
+                   (or buffer-file-name
+                       time-stamp-no-file))
+                  ((eq cur-char ?s)    ;system name, legacy
+                   (system-name))
+                  ((eq cur-char ?u)    ;user name, legacy
+                   (user-login-name))
+                  ((eq cur-char ?U)    ;user full name, legacy
+                   (user-full-name))
+                  ((eq cur-char ?l)    ;login name
+                   (user-login-name))
+                  ((eq cur-char ?L)    ;full name of logged-in user
+                   (user-full-name))
+                  ((eq cur-char ?h)    ;mail host name
+                   (or mail-host-address (system-name)))
+                  ((eq cur-char ?q)    ;unqualified host name
+                   (let ((qualname (system-name)))
+                     (if (string-match "\\." qualname)
+                         (substring qualname 0 (match-beginning 0))
+                       qualname)))
+                  ((eq cur-char ?Q)    ;fully-qualified host name
+                   (system-name))
+                  ))
+            (and (numberp field-result)
+                 (= alt-form 0)
+                 (string-equal field-width "")
+                 ;; no width provided; set width for default
+                 (setq field-width "02"))
+           (let ((padded-result
+                  (format (format "%%%s%c"
+                                  field-width
+                                  (if (numberp field-result) ?d ?s))
+                          (or field-result ""))))
+             (let* ((initial-length (length padded-result))
+                    (desired-length (if (string-equal field-width "")
+                                        initial-length
+                                      (string-to-number field-width))))
+               (if (> initial-length desired-length)
+                   ;; truncate strings on right
+                   (if (and (stringp field-result)
+                            (not (eq cur-char ?z))) ;offset does not truncate
+                       (substring padded-result 0 desired-length)
+                      padded-result)   ;numbers don't truncate
+                 padded-result)))))
+         (t
+         (char-to-string cur-char)))))
       (setq ind (1+ ind)))
     result))
 
@@ -690,6 +715,176 @@ Suggests replacing OLD-FORM with NEW-FORM."
       (insert "\"" old-form "\" -- use " new-form "\n"))
     (display-buffer "*Time-stamp-compatibility*"))))
 
+;;; A principled, expressive implementation of time zone offset
+;;; formatting ("%z" and variants).
+
+;;; * Overarching principle for %z
+
+;; The output should be clear and complete.
+;;
+;; That is,
+;; a) it should be unambiguous what offset is represented, and
+;; b) it should be possible to exactly recreate the offset.
+
+;;; * Principles for %z
+
+;; - The numeric fields are HHMMSS.
+;; - The fixed point is at the left.  The first 2 digits are always
+;;   hours, the next 2 (if they exist) minutes, and next 2 (if they
+;;   exist) seconds.  "+11" is 11 hours (not 11 minutes, not 11 seconds).
+;;   "+1015" is 10 hours 15 minutes (not 10 minutes 15 seconds).
+;; - Each of the three numeric fields is two digits.
+;;   "+1" and "+100" are illegal.  (Is that 1 hour? 10 hours? 100 hours?)
+;; - The MMSS fields may be omitted only if both are 00.  Thus, the width
+;;   of the field depends on the data.  (This is similar to how
+;;   %B is always long enough to spell the entire month name.)
+;; - The SS field may be omitted only if it is 00.
+;; - Colons between the numeric fields are an option, unless the hours
+;;   field is greater than 99, when colons are needed to prevent ambiguity.
+;; - If padding with zeros, we must pad on the right, because the
+;;   fixed point is at the left.  (This is similar to how %N,
+;;   fractional seconds, must add its zeros on the right.)
+;; - After zero-padding has filled out minutes and seconds with zeros,
+;;   further padding can be blanks only.
+;;   Any additional zeros would be confusing.
+
+;;; * Padding for %z
+
+;; Padding is under-specified, so we had to make choices.
+;;
+;; Principles guiding our choices:
+;;
+;; - The syntax should be easy to remember and the effect predictable.
+;; - It should be possible to produces as many useful effects as possible.
+;;
+;; Padding choices:
+;;
+;; - By default, pad with spaces, as other formats with non-digits do.
+;;   The "0" flag pads first with zeros, until seconds are filled out.
+;; - If padding with spaces, pad on the right.  This is consistent with
+;;   how zero-padding works.  Padding on the right also keeps the fixed
+;;   point in the same place, as other formats do for any given width.
+;; - The %_z format always outputs seconds, allowing all added padding
+;;   to be spaces.  Without this rule, there would be no way to
+;;   request seconds that worked for both 2- and 3-digit hours.
+;; - Conflicting options are rejected, lest users depend
+;;   on incidental behavior.
+;;
+;; Padding combos that make no sense and are thus disallowed:
+;;
+;; %-:z   - minus minimizes to hours, : expands to minutes
+;; %-::z  - minus minimizes to hours, :: expands to seconds
+;; %_:z   - underscore requires seconds, : displays minutes
+;; %_:::z - underscore requires seconds, ::: minimizes to hours
+;;
+;; Example padding effects (with offsets of 99 and 100 hours):
+;;
+;; %-7z   "+99    "   "+100:00"
+;;  %7z   "+9900  "   "+100:00"
+;; %07z   "+990000"   "+100:00"
+;; %_7z   "+990000"   "+100:00:00"
+;;
+;; %7:::z "+99    "   "+100:00"
+;; %7:z   "+99:00 "   "+100:00"
+;; %07:z  "+99:00:00" "+100:00"
+;; %7::z  "+99:00:00" "+100:00:00"
+
+;;; * BNF syntax of the offset string produced by %z
+
+;; <offset> ::= <sign><hours>[<minutes>[<seconds>]]<padding> |
+;;              <sign><hours>[<colonminutes>[<colonseconds>]]<padding> |
+;;              <sign><bighours><colonminutes>[<colonseconds>]<padding>
+;; <sign> ::= "+"|"-"
+;; <hours> ::= <2digits>
+;; <minutes> ::= <2digits>
+;; <seconds> ::= <2digits>
+;; <colonminutes> ::= ":"<minutes>
+;; <colonseconds> ::= ":"<seconds>
+;; <2digits> ::= <digit><digit>
+;; <digit> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
+;; <bighours> ::= <digit>*<digit><2digits>
+;; <padding> ::= " "*
+
+(defun time-stamp-formatz-from-parsed-options (flag-minimize
+                                               flag-pad-spaces-only
+                                               flag-pad-zeros-first
+                                               colon-count
+                                               field-width
+                                               offset-secs)
+  "Formats a time offset according to a %z variation.
+The caller of this function must have already parsed the %z format
+string; this function accepts just the parts of the format.
+
+With no flags, the output includes hours and minutes: +-HHMM
+unless there is a non-zero seconds part, in which case the seconds
+are included: +-HHMMSS
+
+FLAG-MINIMIZE is whether \"-\" was specified.  If non-nil, the
+output may be limited to hours if minutes and seconds are zero.
+
+FLAG-PAD-SPACES-ONLY is whether \"_\" was specified.  If non-nil,
+seconds must be output, so that any padding can be spaces only.
+
+FLAG-PAD-ZEROS-FIRST is whether \"0\" was specified.  If non-nil,
+padding to the requested FIELD-WIDTH (if any) is done by adding
+00 seconds before padding with spaces.
+
+COLON-COUNT is the number of colons preceding the \"z\" (0-3).  One or
+two colons put that many colons in the output (+-HH:MM or +-HH:MM:SS).
+Three colons outputs only hours if minutes and seconds are zero and
+includes colon separators if minutes and seconds are output.
+
+FIELD-WIDTH is a whole number giving the minimum number of characters
+in the output; 0 specifies no minimum.  Additional characters will be
+added on the right if necessary.  The added characters will be spaces
+unless FLAG-PAD-ZEROS-FIRST is non-nil.
+
+OFFSET-SECS is the time zone offset (in seconds east of UTC) to be
+formatted according to the preceding parameters."
+  (let ((hrs (/ (abs offset-secs) 3600))
+        (mins (/ (% (abs offset-secs) 3600) 60))
+        (secs (% (abs offset-secs) 60))
+        (result ""))
+    ;; valid option combo?
+    (cond
+     ((not (or (and flag-minimize (> colon-count 0))
+               (and flag-pad-spaces-only (> colon-count 0))
+               (and flag-pad-spaces-only flag-minimize)
+               (and flag-pad-spaces-only flag-pad-zeros-first)
+               (and flag-pad-zeros-first flag-minimize)))
+      (setq result (concat result (if (>= offset-secs 0) "+" "-")))
+      (setq result (concat result (format "%02d" hrs)))
+      ;; Need minutes?
+      (cond
+       ((or (> hrs 99)
+            (> mins 0)
+            (> secs 0)
+            (not (or flag-minimize (= colon-count 3)))
+            (and (> field-width (length result))
+                 flag-pad-zeros-first))
+        ;; Need colon before minutes?
+        (if (or (> colon-count 0)
+                (> hrs 99))
+            (setq result (concat result ":")))
+        (setq result (concat result (format "%02d" mins)))
+        ;; Need seconds, too?
+        (cond
+         ((or (> secs 0)
+              (= colon-count 2)
+              flag-pad-spaces-only
+              (and (> field-width (length result))
+                   flag-pad-zeros-first))
+          ;; Need colon before seconds?
+          (if (or (> colon-count 0)
+                  (> hrs 99))
+              (setq result (concat result ":")))
+          (setq result (concat result (format "%02d" secs)))))))
+      ;; Need padding?
+      (let ((needed-padding (- field-width (length result))))
+        (if (> needed-padding 0)
+            (setq result (concat result (make-string needed-padding ?\s)))))))
+    result))
+
 (provide 'time-stamp)
 
 ;;; time-stamp.el ends here
diff --git a/lisp/transient.el b/lisp/transient.el
index 6e7b5ea..5f66a13 100644
--- a/lisp/transient.el
+++ b/lisp/transient.el
@@ -4,25 +4,28 @@
 
 ;; Author: Jonas Bernoulli <jonas@bernoul.li>
 ;; Homepage: https://github.com/magit/transient
-;; Package-Requires: ((emacs "25.1"))
-;; Package-Version: 0.3.2
 ;; Keywords: bindings
 
-;; This file is part of GNU Emacs.
+;; Package-Requires: ((emacs "25.1"))
+;; Package-Version: 0.3.6
+
+;; SPDX-License-Identifier: GPL-3.0-or-later
 
 ;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published
 ;; by the Free Software Foundation, either version 3 of the License,
 ;; or (at your option) any later version.
-
+;;
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
-
+;;
 ;; You should have received a copy of the GNU General Public License
 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
+;; This file is part of GNU Emacs.
+
 ;;; Commentary:
 
 ;; Taking inspiration from prefix keys and prefix arguments, Transient
@@ -158,7 +161,12 @@ function should accept two arguments: a buffer to display 
and
 an alist of the same form as ALIST.  See `display-buffer' for
 details.
 
-The default is (display-buffer-in-side-window (side . bottom)).
+The default is:
+
+  (display-buffer-in-side-window
+    (side . bottom)
+    (inhibit-same-window . t))
+
 This displays the window at the bottom of the selected frame.
 Another useful value is (display-buffer-below-selected).  This
 is what `magit-popup' used by default.  For more alternatives
@@ -231,6 +239,20 @@ and `transient-nonstandard-key'."
   :group 'transient
   :type 'boolean)
 
+(defcustom transient-highlight-higher-levels nil
+  "Whether to highlight suffixes on higher levels.
+
+This is primarily intended for package authors.
+
+When non-nil then highlight the description of suffixes whose
+level is above 4, the default of `transient-default-level'.
+Assuming you have set that variable to 7, this highlights all
+suffixes that won't be available to users without them making
+the same customization."
+  :package-version '(transient . "0.3.6")
+  :group 'transient
+  :type 'boolean)
+
 (defcustom transient-substitute-key-function nil
   "Function used to modify key bindings.
 
@@ -293,7 +315,20 @@ be remapped to `fixed-pitch' in that buffer."
   :group 'transient
   :type 'boolean)
 
-(defcustom transient-default-level 4
+(defcustom transient-force-single-column nil
+  "Whether to force use of a single column to display suffixes.
+
+This might be useful for users with low vision who use large
+text and might otherwise have to scroll in two dimensions."
+  :package-version '(transient . "0.3.6")
+  :group 'transient
+  :type 'boolean)
+
+(defconst transient--default-child-level 1)
+
+(defconst transient--default-prefix-level 4)
+
+(defcustom transient-default-level transient--default-prefix-level
   "Control what suffix levels are made available by default.
 
 Each suffix command is placed on a level and each prefix command
@@ -427,6 +462,11 @@ See info node `(transient)Enabling and Disabling 
Suffixes'."
 See info node `(transient)Enabling and Disabling Suffixes'."
   :group 'transient-faces)
 
+(defface transient-higher-level '((t :underline t))
+  "Face optionally used to highlight suffixes on higher levels.
+Also see option `transient-highlight-higher-levels'."
+  :group 'transient-faces)
+
 (defface transient-separator
   `((((class color) (background light))
      ,@(and (>= emacs-major-version 27) '(:extend t))
@@ -566,7 +606,7 @@ the prototype is stored in the clone's `prototype' slot.")
 (defclass transient-child ()
   ((level
     :initarg :level
-    :initform 1
+    :initform (symbol-value 'transient--default-child-level)
     :documentation "Enable if level of prefix is equal or greater.")
    (if
     :initarg :if
@@ -929,7 +969,7 @@ example, sets a variable use `transient-define-infix' 
instead.
           (if (eq k :class)
               (setq class pop)
             (setq args (plist-put args k pop)))))
-      (vector (or level (oref-default 'transient-child level))
+      (vector (or level transient--default-child-level)
               (or class
                   (if (vectorp car)
                       'transient-columns
@@ -1000,7 +1040,7 @@ example, sets a variable use `transient-define-infix' 
instead.
     (unless (plist-get args :key)
       (when-let ((shortarg (plist-get args :shortarg)))
         (setq args (plist-put args :key shortarg))))
-    (list (or level (oref-default 'transient-child level))
+    (list (or level transient--default-child-level)
           (or class 'transient-suffix)
           args)))
 
@@ -1965,6 +2005,11 @@ value.  Otherwise return CHILDREN as is."
 
 (defun transient--post-command ()
   (transient--debug 'post-command)
+  (unless this-command
+    (transient--debug "-- force pre-exit from post-command")
+    (message "Quit transient!")
+    (transient--pre-exit)
+    (setq transient--exitp t))
   (if transient--exitp
       (progn
         (unless (and (eq transient--exitp 'replace)
@@ -2040,7 +2085,8 @@ value.  Otherwise return CHILDREN as is."
     (if (symbolp arg)
         (message "-- %-16s (cmd: %s, event: %S, exit: %s)"
                  arg
-                 (transient--suffix-symbol this-command)
+                 (or (transient--suffix-symbol this-command)
+                     (list this-command this-original-command last-command))
                  (key-description (this-command-keys-vector))
                  transient--exitp)
       (apply #'message arg args))))
@@ -2910,13 +2956,21 @@ have a history of their own.")
          (cw (mapcar (lambda (col) (apply #'max (mapcar #'length col)))
                      columns))
          (cc (transient--seq-reductions-from (apply-partially #'+ 3) cw 0)))
-    (dotimes (r rs)
-      (dotimes (c cs)
-        (insert (make-string (- (nth c cc) (current-column)) ?\s))
-        (when-let ((cell (nth r (nth c columns))))
-          (insert cell))
-        (when (= c (1- cs))
-          (insert ?\n))))))
+    (if transient-force-single-column
+        (dotimes (c cs)
+          (dotimes (r rs)
+            (when-let ((cell (nth r (nth c columns))))
+              (unless (equal cell "")
+                (insert cell ?\n))))
+          (unless (= c (1- cs))
+            (insert ?\n)))
+      (dotimes (r rs)
+        (dotimes (c cs)
+          (insert (make-string (- (nth c cc) (current-column)) ?\s))
+          (when-let ((cell (nth r (nth c columns))))
+            (insert cell))
+          (when (= c (1- cs))
+            (insert ?\n)))))))
 
 (cl-defmethod transient--insert-group ((group transient-subgroups))
   (let* ((subgroups (oref group suffixes))
@@ -2971,9 +3025,7 @@ Optional support for popup buttons is also implemented 
here."
                                          'transient-disabled-suffix))))
               (cl-call-next-method obj))))
     (when (oref obj inapt)
-      (set-text-properties 0 (length str)
-                           (list 'face 'transient-inapt-suffix)
-                           str))
+      (add-face-text-property 0 (length str) 'transient-inapt-suffix nil str))
     (if transient-enable-popup-navigation
         (make-text-button str nil
                           'type 'transient-button
@@ -3085,9 +3137,15 @@ If the OBJ's `key' is currently unreachable, then apply 
the face
                        (funcall (oref transient--prefix suffix-description)
                                 obj))
                   (propertize "(BUG: no description)" 'face 'error))))
-    (if (transient--key-unreachable-p obj)
-        (propertize desc 'face 'transient-unreachable)
-      desc)))
+    (cond ((transient--key-unreachable-p obj)
+           (propertize desc 'face 'transient-unreachable))
+          ((and transient-highlight-higher-levels
+                (> (oref obj level) transient--default-prefix-level))
+           (add-face-text-property
+            0 (length desc) 'transient-higher-level nil desc)
+           desc)
+          (t
+           desc))))
 
 (cl-defgeneric transient-format-value (obj)
   "Format OBJ's value for display and return the result.")
@@ -3189,13 +3247,16 @@ Show the first one that is specified."
         (transient--show-manpage manpage)
       (transient--describe-function (oref obj command)))))
 
-(cl-defmethod transient-show-help ((_   transient-suffix))
+(cl-defmethod transient-show-help ((obj transient-suffix))
   "Show the command doc-string."
   (if (eq this-original-command 'transient-help)
       (if-let ((manpage (oref transient--prefix man-page)))
           (transient--show-manpage manpage)
         (transient--describe-function (oref transient--prefix command)))
-    (transient--describe-function this-original-command)))
+    (if-let ((prefix (get (transient--suffix-command obj) 'transient--prefix))
+             (manpage (oref prefix man-page)))
+        (transient--show-manpage manpage)
+      (transient--describe-function this-original-command))))
 
 (cl-defmethod transient-show-help ((obj transient-infix))
   "Show the manpage if defined or the command doc-string.
@@ -3569,7 +3630,7 @@ we stop there."
                                   "transient-define-argument"
                                   "transient-define-suffix")
                             t)
-                "\\_>[ \t'\(]*"
+                "\\_>[ \t'(]*"
                 "\\(\\(?:\\sw\\|\\s_\\)+\\)?")
        (1 'font-lock-keyword-face)
        (2 'font-lock-function-name-face nil t)))))
@@ -3580,9 +3641,9 @@ we stop there."
 ;;;; `transient-lisp-variable'
 
 (defclass transient-lisp-variable (transient-variable)
-  ((reader :initform transient-lisp-variable--reader)
+  ((reader :initform #'transient-lisp-variable--reader)
    (always-read :initform t)
-   (set-value :initarg :set-value :initform set))
+   (set-value :initarg :set-value :initform #'set))
   "[Experimental] Class used for Lisp variables.")
 
 (cl-defmethod transient-init-value ((obj transient-lisp-variable))
diff --git a/lisp/uniquify.el b/lisp/uniquify.el
index 7cc0168..ffb5ecc 100644
--- a/lisp/uniquify.el
+++ b/lisp/uniquify.el
@@ -246,7 +246,14 @@ this rationalization."
                              (if (buffer-live-p (uniquify-item-buffer item))
                                  item))
                            items)))
-         (setq fix-list (append fix-list items))))
+          ;; Other buffer's `uniquify-managed' lists may share
+          ;; elements.  Ensure that we don't add these elements more
+          ;; than once to this buffer's `uniquify-managed' list.
+          (let ((new-items nil))
+            (dolist (item items)
+              (unless (memq item fix-list)
+                (push item new-items)))
+           (setq fix-list (append fix-list new-items)))))
       ;; selects buffers whose names may need changing, and others that
       ;; may conflict, then bring conflicting names together
       (uniquify-rationalize fix-list))))
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 2c72c45..4652afa 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -1767,13 +1767,26 @@ char-offset in TEXT."
            (delete-region (point-min) keep))
          ;; Remove line-prefix characters, and unneeded lines (unified diffs).
           ;; Also skip lines like "\ No newline at end of file"
-         (let ((kill-chars (list (if destp ?- ?+) ?\\)))
+         (let ((kill-chars (list (if destp ?- ?+) ?\\))
+                curr-char last-char)
            (goto-char (point-min))
            (while (not (eobp))
-             (if (memq (char-after) kill-chars)
-                 (delete-region (point) (progn (forward-line 1) (point)))
+             (setq curr-char (char-after))
+             (if (memq curr-char kill-chars)
+                 (delete-region
+                  ;; Check for "\ No newline at end of file"
+                  (if (and (eq curr-char ?\\)
+                           (not (eq last-char (if destp ?- ?+)))
+                           (save-excursion
+                             (forward-line 1)
+                             (or (eobp) (and (eq last-char ?-)
+                                             (eq (char-after) ?+)))))
+                      (max (1- (point)) (point-min))
+                    (point))
+                  (progn (forward-line 1) (point)))
                (delete-char num-pfx-chars)
-               (forward-line 1)))))
+               (forward-line 1))
+             (setq last-char curr-char))))
 
        (let ((text (buffer-substring-no-properties (point-min) (point-max))))
          (if char-offset (cons text (- (point) (point-min))) text))))))
@@ -2252,17 +2265,20 @@ Call FUN with two args (BEG and END) for each hunk."
       ;; same hunk.
       (goto-char (next-single-char-property-change
                   (point) 'diff--font-lock-refined nil max)))
-    (diff--iterate-hunks
-     max
-     (lambda (beg end)
-       (unless (get-char-property beg 'diff--font-lock-refined)
-         (diff--refine-hunk beg end)
-         (let ((ol (make-overlay beg end)))
-           (overlay-put ol 'diff--font-lock-refined t)
-           (overlay-put ol 'diff-mode 'fine)
-           (overlay-put ol 'evaporate t)
-           (overlay-put ol 'modification-hooks
-                        '(diff--overlay-auto-delete))))))))
+    ;; Ignore errors that diff cannot be found so that custom font-lock
+    ;; keywords after `diff--font-lock-refined' can still be evaluated.
+    (ignore-error file-missing
+      (diff--iterate-hunks
+       max
+       (lambda (beg end)
+         (unless (get-char-property beg 'diff--font-lock-refined)
+           (diff--refine-hunk beg end)
+           (let ((ol (make-overlay beg end)))
+             (overlay-put ol 'diff--font-lock-refined t)
+             (overlay-put ol 'diff-mode 'fine)
+             (overlay-put ol 'evaporate t)
+             (overlay-put ol 'modification-hooks
+                          '(diff--overlay-auto-delete)))))))))
 
 (defun diff--overlay-auto-delete (ol _after _beg _end &optional _len)
   (delete-overlay ol))
diff --git a/lisp/vc/ediff-diff.el b/lisp/vc/ediff-diff.el
index b93dfc8..0965e88 100644
--- a/lisp/vc/ediff-diff.el
+++ b/lisp/vc/ediff-diff.el
@@ -231,10 +231,7 @@ one optional arguments, diff-number to refine.")
           (sit-for 2)
           ;; 1 is an error exit code
           1)
-         (t (message "Computing differences between %s and %s ..."
-                     (file-name-nondirectory file1)
-                     (file-name-nondirectory file2))
-            ;; this erases the diff buffer automatically
+         (t ;; this erases the diff buffer automatically
             (ediff-exec-process ediff-diff-program
                                 diff-buffer
                                 'synchronize
@@ -1146,7 +1143,10 @@ are ignored."
         (if (string-match "buffer" (symbol-name ediff-job-name))
             ediff-coding-system-for-write
           ediff-coding-system-for-read))
-       args)
+        (process-environment
+         ;; Avoid localization of messages so we can parse the output.
+         (cons "LC_MESSAGES=C" process-environment))
+        args)
     (setq args (append (split-string options)
                        (mapcar (lambda (file)
                                  (when (stringp file)
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 1c78490..b2b92b1 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -2002,9 +2002,8 @@ ARG is a prefix argument.  If nil, copy the current 
difference region."
                    (goto-char reg-to-delete-end)
                    (insert reg-to-copy)
 
-                   (if (> reg-to-delete-end reg-to-delete-beg)
-                       (kill-region reg-to-delete-beg reg-to-delete-end))
-                   ))
+                   (when (> reg-to-delete-end reg-to-delete-beg)
+                     (delete-region reg-to-delete-beg reg-to-delete-end))))
                (or batch-invocation
                    (setq
                     messg
@@ -2105,8 +2104,8 @@ ARG is a prefix argument.  If nil, copy the current 
difference region."
            (goto-char reg-end)
            (insert saved-diff)
 
-           (if (> reg-end reg-beg)
-               (kill-region reg-beg reg-end))
+           (when (> reg-end reg-beg)
+             (delete-region reg-beg reg-end))
 
            (setq recovered t)
            ))
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index eabbaba..4a44787 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -203,13 +203,15 @@ when this variable is set to nil.")
 ;;; Originally taken from VC-Log mode
 
 (defconst log-edit-maximum-comment-ring-size 32
-  "Maximum number of saved comments in the comment ring.")
+  "Maximum number of saved commit comments in `log-edit-comment-ring'.")
 (defvar log-edit-comment-ring (make-ring log-edit-maximum-comment-ring-size))
 (defvar log-edit-comment-ring-index nil)
 (defvar log-edit-last-comment-match "")
 
 (defun log-edit-new-comment-index (stride len)
-  "Return the comment index STRIDE elements from the current one.
+  "Return the comment whose index is STRIDE elements away from the current one.
+This accesses `log-edit-comment-ring', which stores commit log comments,
+i.e. descriptions of changes done by commits.
 LEN is the length of `log-edit-comment-ring'."
   (mod (cond
        (log-edit-comment-ring-index (+ log-edit-comment-ring-index stride))
@@ -221,7 +223,7 @@ LEN is the length of `log-edit-comment-ring'."
        len))
 
 (defun log-edit-previous-comment (arg)
-  "Cycle backwards through comment history.
+  "Cycle backwards through VC commit comment history.
 With a numeric prefix ARG, go back ARG comments."
   (interactive "*p")
   (let ((len (ring-length log-edit-comment-ring)))
@@ -234,15 +236,15 @@ With a numeric prefix ARG, go back ARG comments."
       (insert (ring-ref log-edit-comment-ring log-edit-comment-ring-index)))))
 
 (defun log-edit-next-comment (arg)
-  "Cycle forwards through comment history.
+  "Cycle forwards through VC commit comment history.
 With a numeric prefix ARG, go forward ARG comments."
   (interactive "*p")
   (log-edit-previous-comment (- arg)))
 
 (defun log-edit-comment-search-backward (str &optional stride)
-  "Search backwards through comment history for substring match of STR.
+  "Search backwards through VC commit comment history for a match of STR.
 If the optional argument STRIDE is present, that is a step-width to use
-when going through the comment ring."
+when going through the comment ring, `log-edit-comment-ring'."
   ;; Why substring rather than regexp ?   -sm
   (interactive
    (list (read-string (format-prompt "Comment substring"
@@ -262,7 +264,7 @@ when going through the comment ring."
     (log-edit-previous-comment 0)))
 
 (defun log-edit-comment-search-forward (str)
-  "Search forwards through comment history for a substring match of STR."
+  "Search forwards through VC commit comment history for a match of STR."
   (interactive
    (list (read-string (format-prompt "Comment substring"
                                      log-edit-last-comment-match)
@@ -270,10 +272,15 @@ when going through the comment ring."
   (log-edit-comment-search-backward str -1))
 
 (defun log-edit-comment-to-change-log (&optional whoami file-name)
-  "Enter last VC comment into the change log for the current file.
-WHOAMI (interactive prefix) non-nil means prompt for user name
-and site.  FILE-NAME is the name of the change log; if nil, use
-`change-log-default-name'.
+  "Insert the last VC commit comment into the change log for the current file.
+This reuses the text of the last VC commit comment in `log-edit-comment-ring'
+for the change-log entry of the current file, which is handy when several
+related changes have the same commit comment.
+WHOAMI (interactively, prefix argument) non-nil means prompt for user name
+and email address of the person to whom to attribute the change.
+FILE-NAME is the name of the change log; if nil, use `change-log-default-name'
+Interactively, with prefix argument, prompt for both the name and address of
+the person who did the change and for FILE-NAME.
 
 This may be useful as a `vc-checkin-hook' to update change logs
 automatically."
@@ -332,7 +339,7 @@ automatically."
 
 (defconst log-edit-header-contents-regexp
   "[ \t]*\\(.*\\(\n[ \t].*\\)*\\)\n?"
-  "Regular expression matching a header field.
+  "Regular expression matching the header field in `log-edit-mode'.
 The first subexpression is the actual text of the field.")
 
 (defun log-edit-match-to-eoh (_limit)
@@ -393,7 +400,9 @@ The first subexpression is the actual text of the field.")
     (log-edit--match-first-line (0 'log-edit-summary))))
 
 (defvar log-edit-font-lock-gnu-style nil
-  "If non-nil, highlight common failures to follow the GNU coding standards.")
+  "If non-nil, highlight common failures to follow VC commit log conventions.
+The conventions checked are those described in the GNU coding standards
+document.")
 (put 'log-edit-font-lock-gnu-style 'safe-local-variable 'booleanp)
 
 (defconst log-edit-font-lock-gnu-keywords
@@ -436,28 +445,28 @@ The first subexpression is the actual text of the field.")
 
 ;;;###autoload
 (defun log-edit (callback &optional setup params buffer mode &rest _ignore)
-  "Setup a buffer to enter a log message.
-The buffer is put in mode MODE or `log-edit-mode' if MODE is nil.
+  "Setup a buffer to enter a VC commit log message.
+The buffer is put in mode MODE, or `log-edit-mode' if MODE is nil.
 \\<log-edit-mode-map>
 If SETUP is non-nil, erase the buffer and run `log-edit-hook'.
 Set mark and point around the entire contents of the buffer, so
 that it is easy to kill the contents of the buffer with
-\\[kill-region].  Once the user is done editing the message,
-invoking the command \\[log-edit-done] (`log-edit-done') will
-call CALLBACK to do the actual commit.
+\\[kill-region].  Once the user is done editing the message, he
+or she is expected to invoke the command \\[log-edit-done] (`log-edit-done'),
+which will call CALLBACK, a function to do the actual commit.
 
-PARAMS if non-nil is an alist of variables and buffer-local
-values to give them in the Log Edit buffer.  Possible keys and
-associated values:
+PARAMS, if non-nil, is an alist of variables and buffer-local
+values to give to those variables in the Log Edit buffer.  Possible
+keys and associated values are:
  `log-edit-listfun' -- function taking no arguments that returns the list of
- files that are concerned by the current operation (using relative names);
+    files that are concerned by the current operation (using relative names);
  `log-edit-diff-function' -- function taking no arguments that
- displays a diff of the files concerned by the current operation.
+    displays a diff of the files concerned by the current operation.
  `vc-log-fileset' -- the VC fileset to be committed (if any).
 
-If BUFFER is non-nil `log-edit' will jump to that buffer, use it
+If BUFFER is non-nil, `log-edit' will switch to that buffer, use it
 to edit the log message and go back to the current buffer when
-done.  Otherwise, it uses the current buffer."
+done.  Otherwise, this function will use the current buffer."
   (let ((parent (current-buffer)))
     (if buffer (pop-to-buffer buffer))
     (when (and log-edit-setup-invert (not (eq setup 'force)))
@@ -483,12 +492,12 @@ done.  Otherwise, it uses the current buffer."
              "Press \\[log-edit-done] when you are done editing."))))
 
 (define-derived-mode log-edit-mode text-mode "Log-Edit"
-  "Major mode for editing version-control log messages.
-When done editing the log entry, just type \\[log-edit-done] which
-will trigger the actual commit of the file(s).
-Several other handy support commands are provided of course and
-the package from which this is used might also provide additional
-commands (under C-x v for VC, for example).
+  "Major mode for editing version-control (VC) commit log messages.
+When done editing the log entry, type \\[log-edit-done], which will
+trigger the actual commit of the file(s).
+Several other handy support commands are provided, and the package
+from which this is used might also provide additional commands (under
+the \"C-x v\" prefix for VC commands, for example).
 
 \\{log-edit-mode-map}"
   (setq-local font-lock-defaults '(log-edit-font-lock-keywords t))
@@ -520,7 +529,7 @@ commands (under C-x v for VC, for example).
     (insert "):")))
 
 (defun log-edit-fill-entry (&optional justify)
-  "Like \\[fill-paragraph], but handle ChangeLog entries.
+  "Like \\[fill-paragraph], but for filling ChangeLog-formatted entries.
 Consecutive function entries without prose (i.e., lines of the
 form \"(FUNCTION):\") will be combined into \"(FUNC1, FUNC2):\"
 according to `fill-column'."
@@ -570,7 +579,7 @@ according to `fill-column'."
     (ring-insert log-edit-comment-ring comment)))
 
 (defun log-edit-done ()
-  "Finish editing the log message and commit the files.
+  "Finish editing the VC commit log message, and commit the files.
 If you want to abort the commit, simply delete the buffer."
   (interactive)
   ;; Clean up empty headers.
@@ -617,9 +626,9 @@ If you want to abort the commit, simply delete the buffer."
       (call-interactively log-edit-callback))))
 
 (defun log-edit-kill-buffer ()
-  "Kill the current buffer.
-Also saves its contents in the comment history and hides
-`log-edit-files-buf'."
+  "Kill the current VC commit log buffer.
+This command saves the contents of the log buffer in the VC commit
+comment history, see `log-edit-comment-ring', and hides `log-edit-files-buf'."
   (interactive)
   (log-edit-hide-buf)
   (let ((buf (current-buffer)))
@@ -699,7 +708,7 @@ different header separator appropriate for `log-edit-mode'."
         (eobp))))
 
 (defun log-edit-insert-message-template ()
-  "Insert the default template with Summary and Author."
+  "Insert the default VC commit log template with Summary and Author."
   (interactive)
   (when (or (called-interactively-p 'interactive)
             (log-edit-empty-buffer-p))
@@ -710,7 +719,7 @@ different header separator appropriate for `log-edit-mode'."
     (message-position-point)))
 
 (defun log-edit-insert-cvs-template ()
-  "Insert the template specified by the CVS administrator, if any.
+  "Insert the commit log template specified by the CVS administrator, if any.
 This simply uses the local CVS/Template file."
   (interactive)
   (when (or (called-interactively-p 'interactive)
@@ -722,7 +731,7 @@ This simply uses the local CVS/Template file."
       (insert-file-contents "CVS/Template"))))
 
 (defun log-edit-insert-cvs-rcstemplate ()
-  "Insert the rcstemplate from the CVS repository.
+  "Insert the RCS commit log template from the CVS repository.
 This contacts the repository to get the rcstemplate file and
 can thus take some time."
   (interactive)
@@ -756,7 +765,7 @@ can thus take some time."
       (insert (mapconcat 'identity files ", ") ": "))))
 
 (defun log-edit-add-to-changelog ()
-  "Insert this log message into the appropriate ChangeLog file."
+  "Insert this VC commit log message into the appropriate ChangeLog file."
   (interactive)
   (log-edit-remember-comment)
   (dolist (f (log-edit-files))
@@ -770,7 +779,7 @@ can thus take some time."
   "Non-nil means rewrite (tiny change).")
 
 (defvar log-edit-rewrite-fixes nil
-  "Rule to rewrite bug numbers into Fixes: headers.
+  "Rule to rewrite bug numbers into Fixes: headers in commit log messages.
 The value should be of the form (REGEXP . REPLACEMENT)
 where REGEXP should match the expression referring to a bug number
 in the text, and REPLACEMENT is an expression to pass to `replace-match'
@@ -788,10 +797,15 @@ to build the Fixes: header.")
 (declare-function diff-add-log-current-defuns "diff-mode" ())
 
 (defun log-edit-generate-changelog-from-diff ()
-  "Insert a log message by looking at the current diff.
-This command will generate a ChangeLog entries listing the
-functions.  You can then add a description where needed, and use
-\\[fill-paragraph] to join consecutive function names."
+  "Insert a VC commit log message by looking at the current diffs.
+This command is intended to be used in the \"*vc-log*\" buffer.
+This command will generate ChangeLog entries listing the modified
+files and functions changed in those files, based on the diffs
+you are about to commit.  You can then add a description for each
+change where needed, and use \\[fill-paragraph] to join consecutive function
+names into a single entry where they all share the same description.
+Should you need to look at the diffs themselves, they can be found
+in the \"*vc-diff*\" buffer produced by this command."
   (interactive)
   (change-log-insert-entries
    (with-current-buffer
@@ -809,21 +823,21 @@ functions.  You can then add a description where needed, 
and use
      (diff-add-log-current-defuns))))
 
 (defun log-edit-insert-changelog (&optional use-first)
-  "Insert a log message by looking at the ChangeLog.
+  "Insert a VC commit log message by looking at the ChangeLog.
 The idea is to write your ChangeLog entries first, and then use this
-command to commit your changes.
+command to commit your changes with that log.
 
-To select default log text, we:
-- find the ChangeLog entries for the files to be checked in,
-- verify that the top entry in the ChangeLog is on the current date
-  and by the current user; if not, we don't provide any default text,
-- search the ChangeLog entry for paragraphs containing the names of
-  the files we're checking in, and finally
-- use those paragraphs as the log text.
+To select default log text, this command:
+- finds the ChangeLog entries for the files to be checked in;
+- verifies that the top entry in the ChangeLog is on the current date
+    and by the current user; if not, it doesn't provide any default text;
+- searches the ChangeLog entry for paragraphs containing the names of
+    the files to be checked in; and finally
+- uses those paragraphs as the log text.
 
 If the optional prefix arg USE-FIRST is given (via \\[universal-argument]),
-or if the command is repeated a second time in a row, use the first log entry
-regardless of user name or time."
+or if the command is repeated, use the first log entry regardless of user
+name or time."
   (interactive "P")
   (save-excursion
     (let ((eoh (save-excursion (rfc822-goto-eoh) (point))))
@@ -873,7 +887,7 @@ regardless of user name or time."
 ;;;;
 
 (defun log-edit-narrow-changelog ()
-  "Narrow to the top page of the current buffer, a ChangeLog file.
+  "Narrow to the top page of the current buffer, which visits a ChangeLog file.
 Actually, the narrowed region doesn't include the date line.
 A \"page\" in a ChangeLog file is the area between two dates."
   (or (eq major-mode 'change-log-mode)
@@ -921,7 +935,7 @@ If we are between sub-paragraphs, return the previous 
subparagraph."
 
 (defun log-edit-changelog-entry ()
   "Return the bounds of the ChangeLog entry containing point.
-The variable `log-edit-changelog-full-paragraphs' decides whether an
+The variable `log-edit-changelog-full-paragraphs' determines whether an
 \"entry\" is a paragraph or a subparagraph; see its documentation string
 for more details."
   (save-excursion
@@ -1047,8 +1061,12 @@ where LOGBUFFER is the name of the ChangeLog buffer, and 
each
                             "\\($\\|[^[:alnum:]]\\)")))))
 
 (defun log-edit-changelog-insert-entries (buffer beg end &rest files)
-  "Insert the text from BUFFER between BEG and END.
-Rename relative filenames in the ChangeLog entry as FILES."
+  "Insert the text from ChangeLog BUFFER between BEG and END.
+Rename relative filenames in the ChangeLog entry with FILES.
+FILES are supposed to name the same files whose relative filenames
+are to be replaced, and their names relative to the directory of
+BUFFER are expected to match the relative file names in the ChangeLog
+entry."
   (let ((opoint (point))
        (log-name (buffer-file-name buffer))
        (case-fold-search nil)
@@ -1130,7 +1148,7 @@ Return t if toggled on (or TOGGLE is nil), otherwise nil."
     val))
 
 (defun log-edit-extract-headers (headers comment)
-  "Extract headers from COMMENT to form command line arguments.
+  "Extract headers from VC commit COMMENT to form command line arguments.
 HEADERS should be an alist with elements (HEADER . CMDARG)
 or (HEADER . FUNCTION) associating headers to command line
 options and the result is then a list of the form (MSG ARGUMENTS...)
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index 87ca542..c294586 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -254,7 +254,7 @@ CODE should be a function of no arguments."
   nil)
 
 (defmacro vc-run-delayed (&rest body)
-  (declare (indent 0) (debug t))
+  (declare (indent 0) (debug (def-body)))
   `(vc-exec-after (lambda () ,@body)))
 
 (defvar vc-post-command-functions nil
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index e37c09d..89f9800 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -127,6 +127,13 @@ If nil, use the value of `vc-annotate-switches'.  If t, 
use no switches."
                 (repeat :tag "Argument List" :value ("") string))
   :version "25.1")
 
+(defcustom vc-git-log-switches nil
+  "String or list of strings specifying switches for Git log under VC."
+  :type '(choice (const :tag "None" nil)
+                 (string :tag "Argument String")
+                 (repeat :tag "Argument List" :value ("") string))
+  :version "28.1")
+
 (defcustom vc-git-resolve-conflicts t
   "When non-nil, mark conflicted file as resolved upon saving.
 That is performed after all conflict markers in it have been
@@ -1131,6 +1138,8 @@ This prompts for a branch to merge from."
   :type 'boolean
   :version "26.1")
 
+(autoload 'vc-switches "vc")
+
 (defun vc-git-print-log (files buffer &optional shortlog start-revision limit)
   "Print commit log associated with FILES into specified BUFFER.
 If SHORTLOG is non-nil, use a short format based on `vc-git-root-log-format'.
@@ -1162,9 +1171,10 @@ If LIMIT is a revision string, use it as an 
end-revision."
                (when shortlog
                  `("--graph" "--decorate" "--date=short"
                     ,(format "--pretty=tformat:%s"
-                            (car vc-git-root-log-format))
-                   "--abbrev-commit"))
-               (when (numberp limit)
+                             (car vc-git-root-log-format))
+                    "--abbrev-commit"))
+                vc-git-log-switches
+                (when (numberp limit)
                   (list "-n" (format "%s" limit)))
                (when start-revision
                   (if (and limit (not (numberp limit)))
@@ -1385,8 +1395,6 @@ This requires git 1.8.4 or later, for the \"-L\" option 
of \"git log\"."
                                 samp coding-system-for-read t)))
     (setq coding-system-for-read 'undecided)))
 
-(autoload 'vc-switches "vc")
-
 (defun vc-git-diff (files &optional rev1 rev2 buffer _async)
   "Get a difference report using Git between two revisions of FILES."
   (let (process-file-side-effects
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 95126fa..9338b71 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -979,6 +979,9 @@ be reported.
 If NO-ERROR is nil, signal an error that no VC backend is
 responsible for the given file."
   (or (and (not (file-directory-p file)) (vc-backend file))
+      ;; FIXME it would be more efficient to walk up the directory tree,
+      ;; stopping the first time a backend is responsible.
+      ;;
       ;; First try: find a responsible backend.  If this is for registration,
       ;; it must be a backend under which FILE is not yet registered.
       (let ((dirs (delq nil
diff --git a/lisp/wdired.el b/lisp/wdired.el
index 35211bc..22c1ceb 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -351,13 +351,32 @@ or \\[wdired-abort-changes] to abort changes")))
 ;; This code is a copy of some dired-get-filename lines.
 (defsubst wdired-normalize-filename (file unquotep)
   (when unquotep
-    (setq file
-          ;; FIXME: shouldn't we check for a `b' argument or somesuch before
-          ;; doing such unquoting?  --Stef
-          (read (concat
-                 "\"" (replace-regexp-in-string
-                       "\\([^\\]\\|\\`\\)\"" "\\1\\\\\"" file)
-                 "\""))))
+    ;; Unquote names quoted by ls or by dired-insert-directory.
+    ;; This code was written using `read' to unquote, because
+    ;; it's faster than substituting \007 (4 chars) -> ^G (1
+    ;; char) etc. in a lisp loop.  Unfortunately, this decision
+    ;; has necessitated hacks such as dealing with filenames
+    ;; with quotation marks in their names.
+    (while (string-match "\\(?:[^\\]\\|\\`\\)\\(\"\\)" file)
+      (setq file (replace-match "\\\"" nil t file 1)))
+    ;; Unescape any spaces escaped by ls -b (bug#10469).
+    ;; Other -b quotes, eg \t, \n, work transparently.
+    (if (dired-switches-escape-p dired-actual-switches)
+        (let ((start 0)
+              (rep "")
+              (shift -1))
+          (while (string-match "\\(\\\\\\) " file start)
+            (setq file (replace-match rep nil t file 1)
+                  start (+ shift (match-end 0))))))
+    (when (eq system-type 'windows-nt)
+      (save-match-data
+       (let ((start 0))
+         (while (string-match "\\\\" file start)
+           (aset file (match-beginning 0) ?/)
+           (setq start (match-end 0))))))
+
+    ;; Hence we don't need to worry about converting `\\' back to `\'.
+    (setq file (read (concat "\"" file "\""))))
   (and file buffer-file-coding-system
        (not file-name-coding-system)
        (not default-file-name-coding-system)
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index 22bfae0..aaa5683 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -1039,6 +1039,9 @@ See also `whitespace-newline' and 
`whitespace-display-mappings'."
                                 1 -1))
     ;; sync states (running a batch job)
     (setq global-whitespace-newline-mode global-whitespace-mode)))
+(make-obsolete 'global-whitespace-newline-mode
+               "use `global-whitespace-mode' with `whitespace-style' set to 
`(newline-mark newline)' instead."
+               "28.1")
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 49baab6..9a34dc8 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -4011,7 +4011,10 @@ is inline."
 
 (defun widget-boolean-prompt-value (_widget prompt _value _unbound)
   ;; Toggle a boolean.
-  (y-or-n-p prompt))
+  ;; Say what "y" means.  A la
+  ;; "Set customized value for bar to true: (y or n)"
+  (y-or-n-p (concat (replace-regexp-in-string ": ?\\'" "" prompt)
+                    " true: ")))
 
 ;;; The `color' Widget.
 
diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0..f747c40 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -138,17 +138,24 @@ If this variable is set to t, moving left from the 
leftmost window in
 a frame will find the rightmost one, and similarly for the other
 directions.  The minibuffer is skipped over in up/down movements if it
 is inactive."
-  :type 'boolean
-  :group 'windmove)
+  :type 'boolean)
 
 (defcustom windmove-create-window nil
   "Whether movement off the edge of the frame creates a new window.
 If this variable is set to t, moving left from the leftmost window in
 a frame will create a new window on the left, and similarly for the other
-directions."
-  :type 'boolean
-  :group 'windmove
-  :version "27.1")
+directions.
+This variable may also be a function to be called in this circumstance
+by `windmove-do-window-select'.  The function should accept then as
+argument the DIRECTION targeted, an interactive ARG and a WINDOW
+corresponding to the currently selected window.  It should also return
+a valid window that `windmove-do-window-select' will select,
+or the symbol `no-select' to ignore that final selection."
+  :type '(choice
+          (const :tag "Don't create new windows" nil)
+          (const :tag "Create new windows" t)
+          (function :tag "Provide a function"))
+  :version "28.1")
 
 ;; If your Emacs sometimes places an empty column between two adjacent
 ;; windows, you may wish to set this delta to 2.
@@ -157,11 +164,18 @@ directions."
 Measured in characters either horizontally or vertically; setting this
 to a value larger than 1 may be useful in getting around window-
 placement bugs in old versions of Emacs."
-  :type 'number
-  :group 'windmove)
+  :type 'number)
 (make-obsolete-variable 'windmove-window-distance-delta
                         "no longer used." "27.1")
 
+(defcustom windmove-allow-all-windows nil
+  "Whether the windmove commands are allowed to target all type of windows.
+If this variable is set to non-nil, all windmove commmands will
+ignore the `no-other-window' parameter applied by `display-buffer-alist'
+or `set-window-parameter'."
+  :type 'boolean
+  :version "28.1")
+
 
 ;; Note:
 ;;
@@ -342,7 +356,8 @@ WINDOW must be a live window and defaults to the selected 
one.
 Optional ARG, if negative, means to use the right or bottom edge of
 WINDOW as reference position, instead of `window-point'; if positive,
 use the left or top edge of WINDOW as reference point."
-  (window-in-direction dir window nil arg windmove-wrap-around t))
+  (window-in-direction dir window windmove-allow-all-windows
+                       arg windmove-wrap-around t))
 
 ;; Selects the window that's hopefully at the location returned by
 ;; `windmove-find-other-window', or screams if there's no window there.
@@ -350,19 +365,23 @@ use the left or top edge of WINDOW as reference point."
   "Move to the window at direction DIR as seen from WINDOW.
 DIR, ARG, and WINDOW are handled as by `windmove-find-other-window'.
 If no window is at direction DIR, an error is signaled.
-If `windmove-create-window' is non-nil, try to create a new window
+If `windmove-create-window' is a function, call that function with
+DIR, ARG and WINDOW.  If it is non-nil, try to create a new window
 in direction DIR instead."
   (let ((other-window (windmove-find-other-window dir arg window)))
     (when (and windmove-create-window
                (or (null other-window)
                    (and (window-minibuffer-p other-window)
                         (not (minibuffer-window-active-p other-window)))))
-      (setq other-window (split-window window nil dir)))
+      (setq other-window (if (functionp windmove-create-window)
+                             (funcall windmove-create-window dir arg window)
+                           (split-window window nil dir))))
     (cond ((null other-window)
            (user-error "No window %s from selected window" dir))
           ((and (window-minibuffer-p other-window)
                 (not (minibuffer-window-active-p other-window)))
            (user-error "Minibuffer is inactive"))
+          ((eq other-window 'no-select))
           (t
            (select-window other-window)))))
 
@@ -426,27 +445,72 @@ unless `windmove-create-window' is non-nil and a new 
window is created."
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-mode-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (prefix modifiers alist &optional uninstall)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, adding PREFIX to the beginning, before
+installing the key.  Previous bindings of FN are unbound.
+If UNINSTALL is non-nil, just remove the keys from ALIST."
+  (dolist (bind alist)
+    (dolist (old (where-is-internal (car bind) windmove-mode-map))
+      (define-key windmove-mode-map old nil))
+    (unless uninstall
+      (let ((key (vconcat (if (or (equal prefix [ignore])
+                                  (eq prefix 'none))
+                              nil prefix)
+                          (list (append modifiers (cdr bind))))))
+        (when (eq (key-binding key) #'self-insert-command)
+          (warn "Command %S is shadowing self-insert-key" (car bind)))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when (functionp old-fn)
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 
 ;;; Directional window display and selection
 
 (defcustom windmove-display-no-select nil
-  "Whether the window should be selected after displaying the buffer in it."
-  :type 'boolean
-  :group 'windmove
+  "Whether the window should be selected after displaying the buffer in it.
+If `nil', then the new window where the buffer is displayed will be selected.
+If `ignore', then don't select a window: neither the new nor the old window,
+thus allowing the next command to decide what window it selects.
+Other non-nil values will reselect the old window that was selected before.
+
+The value of this variable can be overridden by the prefix arg of the
+windmove-display-* commands that use `windmove-display-in-direction'.
+
+When `switch-to-buffer-obey-display-actions' is non-nil,
+`switch-to-buffer' commands are also supported."
+  :type '(choice (const :tag "Select new window" nil)
+                 (const :tag "Select old window" t)
+                 (const :tag "Don't select a window" ignore))
   :version "27.1")
 
 (defun windmove-display-in-direction (dir &optional arg)
@@ -454,11 +518,17 @@ Default value of MODIFIERS is `shift'."
 The next buffer is the buffer displayed by the next command invoked
 immediately after this command (ignoring reading from the minibuffer).
 Create a new window if there is no window in that direction.
-By default, select the window with a displayed buffer.
-If prefix ARG is `C-u', reselect a previously selected window.
-If `windmove-display-no-select' is non-nil, this command doesn't
-select the window with a displayed buffer, and the meaning of
-the prefix argument is reversed.
+
+By default, select the new window with a displayed buffer.
+If `windmove-display-no-select' is `ignore', then allow the next command
+to decide what window it selects.  With other non-nil values of
+`windmove-display-no-select', this function reselects
+a previously selected old window.
+
+If prefix ARG is `C-u', reselect a previously selected old window.
+If `windmove-display-no-select' is non-nil, the meaning of
+the prefix argument is reversed and it selects the new window.
+
 When `switch-to-buffer-obey-display-actions' is non-nil,
 `switch-to-buffer' commands are also supported."
   (let ((no-select (xor (consp arg) windmove-display-no-select)))
@@ -483,42 +553,47 @@ When `switch-to-buffer-obey-display-actions' is non-nil,
                        ((eq dir 'same-window)
                         (selected-window))
                        (t (window-in-direction
-                           dir nil nil
+                           dir nil windmove-allow-all-windows
                            (and arg (prefix-numeric-value arg))
                            windmove-wrap-around 'nomini)))))
          (unless window
            (setq window (split-window nil nil dir) type 'window))
          (cons window type)))
      (lambda (old-window new-window)
-       (when (window-live-p (if no-select old-window new-window))
+       (when (and (not (eq windmove-display-no-select 'ignore))
+                  (window-live-p (if no-select old-window new-window)))
          (select-window (if no-select old-window new-window))))
      (format "[display-%s]" dir))))
 
 ;;;###autoload
 (defun windmove-display-left (&optional arg)
   "Display the next buffer in window to the left of the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'."
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'."
   (interactive "P")
   (windmove-display-in-direction 'left arg))
 
 ;;;###autoload
 (defun windmove-display-up (&optional arg)
   "Display the next buffer in window above the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'."
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'."
   (interactive "P")
   (windmove-display-in-direction 'up arg))
 
 ;;;###autoload
 (defun windmove-display-right (&optional arg)
   "Display the next buffer in window to the right of the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'."
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'."
   (interactive "P")
   (windmove-display-in-direction 'right arg))
 
 ;;;###autoload
 (defun windmove-display-down (&optional arg)
   "Display the next buffer in window below the current one.
-See the logic of the prefix ARG in `windmove-display-in-direction'."
+See the logic of the prefix ARG and `windmove-display-no-select'
+in `windmove-display-in-direction'."
   (interactive "P")
   (windmove-display-in-direction 'down arg))
 
@@ -546,17 +621,21 @@ See the logic of the prefix ARG in 
`windmove-display-in-direction'."
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    
'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    
'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    
'windmove-display-new-tab))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 
 ;;; Directional window deletion
@@ -568,8 +647,8 @@ With `M-0' prefix, delete the selected window and
 select the window at direction DIR.
 When `windmove-wrap-around' is non-nil, takes the window
 from the opposite side of the frame."
-  (let ((other-window (window-in-direction dir nil nil arg
-                                           windmove-wrap-around 'nomini)))
+  (let ((other-window (window-in-direction dir nil windmove-allow-all-windows
+                                           arg windmove-wrap-around 'nomini)))
     (cond ((null other-window)
            (user-error "No window %s from selected window" dir))
           (t
@@ -618,16 +697,22 @@ select the window that was below the current one."
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  
'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 
'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    
'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  
'windmove-delete-down))
+  (windmove-install-defaults prefix modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 
 ;;; Directional window swap states
@@ -636,8 +721,8 @@ a single modifier.  Default value of PREFIX is `C-x' and 
MODIFIERS is `shift'."
   "Swap the states of the selected window and the window at direction DIR.
 When `windmove-wrap-around' is non-nil, takes the window
 from the opposite side of the frame."
-  (let ((other-window (window-in-direction dir nil nil nil
-                                           windmove-wrap-around 'nomini)))
+  (let ((other-window (window-in-direction dir nil windmove-allow-all-windows
+                                           nil windmove-wrap-around 'nomini)))
     (cond ((or (null other-window) (window-minibuffer-p other-window))
            (user-error "No window %s from selected window" dir))
           (t
@@ -673,14 +758,99 @@ from the opposite side of the frame."
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  
'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 
'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    
'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  
'windmove-swap-states-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
+
+
+
+(defconst windmove--default-keybindings-type
+  `(choice (const :tag "Don't bind" nil)
+           (cons :tag "Bind using"
+                 (key-sequence :tag "Prefix")
+                 (set :tag "Modifier"
+                      :greedy t
+                      ;; See `(elisp) Keyboard Events'
+                      (const :tag "Meta" meta)
+                      (const :tag "Control" control)
+                      (const :tag "Shift" shift)
+                      (const :tag "Hyper" hyper)
+                      (const :tag "Super" super)
+                      (const :tag "Alt" alt))))
+  "Customisation type for windmove modifiers.")
+
+(defcustom windmove-default-keybindings nil
+  "Default keybindings for regular windmove commands.
+See `windmove-default-keybindings' for more detail."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-left left)
+            (windmove-right right)
+            (windmove-up up)
+            (windmove-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1")
+
+(defcustom windmove-display-default-keybindings nil
+  "Default keybindings for windmove directional buffer display commands.
+See `windmove-display-default-keybindings' for more detail."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-display-left left)
+            (windmove-display-right right)
+            (windmove-display-up up)
+            (windmove-display-down down)
+            (windmove-display-same-window ?0)
+            (windmove-display-new-frame ?f)
+            (windmove-display-new-tab ?t))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1")
+
+(defcustom windmove-delete-default-keybindings nil
+  "Default keybindings for windmove directional window deletion commands.
+See `windmove-delete-default-keybindings' for more detail."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-delete-left left)
+            (windmove-delete-right right)
+            (windmove-delete-up up)
+            (windmove-delete-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1")
+
+(defcustom windmove-swap-states-default-keybindings nil
+  "Default keybindings for windmove's directional window swap-state commands.
+See `windmove-swap-states-default-keybindings' for more detail."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-swap-states-left left)
+            (windmove-swap-states-right right)
+            (windmove-swap-states-up up)
+            (windmove-swap-states-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1")
 
 
 (provide 'windmove)
diff --git a/lisp/window.el b/lisp/window.el
index cf57521..c0511be 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -2499,14 +2499,16 @@ and no others."
 
 (defalias 'some-window 'get-window-with-predicate)
 
-(defun get-lru-window (&optional all-frames dedicated not-selected)
+(defun get-lru-window (&optional all-frames dedicated not-selected no-other)
    "Return the least recently used window on frames specified by ALL-FRAMES.
 Return a full-width window if possible.  A minibuffer window is
 never a candidate.  A dedicated window is never a candidate
 unless DEDICATED is non-nil, so if all windows are dedicated, the
 value is nil.  Avoid returning the selected window if possible.
 Optional argument NOT-SELECTED non-nil means never return the
-selected window.
+selected window.  Optional argument NO-OTHER non-nil means to
+never return a window whose 'no-other-window' parameter is
+non-nil.
 
 The following non-nil values of the optional argument ALL-FRAMES
 have special meanings:
@@ -2526,7 +2528,9 @@ selected frame and no others."
    (let (best-window best-time second-best-window second-best-time time)
     (dolist (window (window-list-1 nil 'nomini all-frames))
       (when (and (or dedicated (not (window-dedicated-p window)))
-                (or (not not-selected) (not (eq window (selected-window)))))
+                (or (not not-selected) (not (eq window (selected-window))))
+                 (or (not no-other)
+                     (not (window-parameter window 'no-other-window))))
        (setq time (window-use-time window))
        (if (or (eq window (selected-window))
                (not (window-full-width-p window)))
@@ -2538,12 +2542,14 @@ selected frame and no others."
            (setq best-window window)))))
     (or best-window second-best-window)))
 
-(defun get-mru-window (&optional all-frames dedicated not-selected)
+(defun get-mru-window (&optional all-frames dedicated not-selected no-other)
    "Return the most recently used window on frames specified by ALL-FRAMES.
 A minibuffer window is never a candidate.  A dedicated window is
 never a candidate unless DEDICATED is non-nil, so if all windows
 are dedicated, the value is nil.  Optional argument NOT-SELECTED
-non-nil means never return the selected window.
+non-nil means never return the selected window.  Optional
+argument NO-OTHER non-nil means to never return a window whose
+'no-other-window' parameter is non-nil.
 
 The following non-nil values of the optional argument ALL-FRAMES
 have special meanings:
@@ -2565,17 +2571,21 @@ selected frame and no others."
       (setq time (window-use-time window))
       (when (and (or dedicated (not (window-dedicated-p window)))
                 (or (not not-selected) (not (eq window (selected-window))))
-                (or (not best-time) (> time best-time)))
+                 (or (not no-other)
+                     (not (window-parameter window 'no-other-window)))
+                 (or (not best-time) (> time best-time)))
        (setq best-time time)
        (setq best-window window)))
     best-window))
 
-(defun get-largest-window (&optional all-frames dedicated not-selected)
+(defun get-largest-window (&optional all-frames dedicated not-selected 
no-other)
   "Return the largest window on frames specified by ALL-FRAMES.
 A minibuffer window is never a candidate.  A dedicated window is
 never a candidate unless DEDICATED is non-nil, so if all windows
 are dedicated, the value is nil.  Optional argument NOT-SELECTED
-non-nil means never return the selected window.
+non-nil means never return the selected window.  Optional
+argument NO-OTHER non-nil means to never return a window whose
+'no-other-window' parameter is non-nil.
 
 The following non-nil values of the optional argument ALL-FRAMES
 have special meanings:
@@ -2596,7 +2606,9 @@ selected frame and no others."
        best-window size)
     (dolist (window (window-list-1 nil 'nomini all-frames))
       (when (and (or dedicated (not (window-dedicated-p window)))
-                (or (not not-selected) (not (eq window (selected-window)))))
+                (or (not not-selected) (not (eq window (selected-window))))
+                 (or (not no-other)
+                     (not (window-parameter window 'no-other-window))))
        (setq size (* (window-pixel-height window)
                      (window-pixel-width window)))
        (when (> size best-size)
@@ -4117,7 +4129,7 @@ frame can be safely deleted."
                  (let ((minibuf (active-minibuffer-window)))
                    (and minibuf (eq frame (window-frame minibuf))
                          (not (eq (default-toplevel-value
-                                    minibuffer-follows-selected-frame)
+                                    'minibuffer-follows-selected-frame)
                                   t)))))
        'frame))
      ((window-minibuffer-p window)
@@ -4130,18 +4142,56 @@ frame can be safely deleted."
       ;; of its frame.
       t))))
 
-(defun window--in-subtree-p (window root)
-  "Return t if WINDOW is either ROOT or a member of ROOT's subtree."
-  (or (eq window root)
-      (let ((parent (window-parent window)))
-       (catch 'done
-         (while parent
-           (if (eq parent root)
-               (throw 'done t)
-             (setq parent (window-parent parent))))))))
+(defun window-at-x-y (x y &optional frame no-other)
+  "Return live window at coordinates X, Y on specified FRAME.
+X and Y are FRAME-relative pixel coordinates.  A coordinate on an
+edge shared by two windows is attributed to the window on the
+right (or below).  Return nil if no such window can be found.
+
+Optional argument FRAME must specify a live frame and defaults to
+the selected one.  Optional argument NO-OTHER non-nil means to
+return nil if the window located at the specified coordinates has
+a non-nil `no-other-window' parameter."
+  (setq frame (window-normalize-frame frame))
+  (let* ((root-edges (window-edges (frame-root-window frame) nil nil t))
+         (root-left (nth 2 root-edges))
+         (root-bottom (nth 3 root-edges)))
+    (catch 'window
+      (walk-window-tree
+       (lambda (window)
+         (let ((edges (window-edges window nil nil t)))
+          (when (and (>= x (nth 0 edges))
+                      (or (< x (nth 2 edges)) (= x root-left))
+                     (>= y (nth 1 edges))
+                      (or (< y (nth 3 edges)) (= y root-bottom)))
+             (if (and no-other (window-parameter window 'no-other-window))
+                 (throw 'window nil)
+              (throw 'window window)))))
+       frame))))
+
+(defcustom delete-window-choose-selected 'mru
+  "How to choose a frame's selected window after window deletion.
+When a frame's selected window gets deleted, Emacs has to choose
+another live window on that frame to serve as its selected
+window.  This option allows to control which window gets selected
+instead.
+
+The possible choices are 'mru' (the default) to select the most
+recently used window on that frame, and 'pos' to choose the
+window at the frame coordinates of point of the previously
+selected window.  If this is nil, choose the frame's first window
+instead.  A window with a non-nil `no-other-window' parameter is
+chosen only if all windows on that frame have that parameter set
+to a non-nil value."
+  :type '(choice (const :tag "Most recently used" mru)
+                 (const :tag "At position of deleted" pos)
+                 (const :tag "Frame's first " nil))
+  :group 'windows
+  :group 'frames
+  :version "28.1")
 
 (defun delete-window (&optional window)
-  "Delete WINDOW.
+  "Delete specified WINDOW.
 WINDOW must be a valid window and defaults to the selected one.
 Return nil.
 
@@ -4156,7 +4206,11 @@ Otherwise, if WINDOW is part of an atomic window, call
 `delete-window' with the root of the atomic window as its
 argument.  Signal an error if WINDOW is either the only window on
 its frame, the last non-side window, or part of an atomic window
-that is its frame's root window."
+that is its frame's root window.
+
+If WINDOW is the selected window on its frame, choose some other
+window as that frame's selected window according to the value of
+the option `delete-window-choose-selected'."
   (interactive)
   (setq window (window-normalize-window window))
   (let* ((frame (window-frame window))
@@ -4191,11 +4245,11 @@ that is its frame's root window."
              (window-combination-resize
               (or window-combination-resize
                   (window-parameter parent 'window-side)))
-            (frame-selected
-             (window--in-subtree-p (frame-selected-window frame) window))
+             (frame-selected-window (frame-selected-window frame))
             ;; Emacs 23 preferably gives WINDOW's space to its left
             ;; sibling.
-            (sibling (or (window-left window) (window-right window))))
+            (sibling (or (window-left window) (window-right window)))
+             frame-selected-window-edges frame-selected-window-pos)
        (window--resize-reset frame horizontal)
        (cond
         ((and (not (eq window-combination-resize t))
@@ -4211,15 +4265,63 @@ that is its frame's root window."
         (t
          ;; Can't do without resizing fixed-size windows.
          (window--resize-siblings window (- size) horizontal t)))
+
+        (when (eq delete-window-choose-selected 'pos)
+          ;; Remember edges and position of point of the selected window
+          ;; of WINDOW'S frame.
+          (setq frame-selected-window-edges
+                (window-edges frame-selected-window nil nil t))
+          (setq frame-selected-window-pos
+                (nth 2 (posn-at-point nil frame-selected-window))))
+
        ;; Actually delete WINDOW.
        (delete-window-internal window)
        (window--pixel-to-total frame horizontal)
-       (when (and frame-selected
-                  (window-parameter
-                   (frame-selected-window frame) 'no-other-window))
-         ;; `delete-window-internal' has selected a window that should
-         ;; not be selected, fix this here.
-         (other-window -1 frame))
+
+        ;; If we deleted the selected window of WINDOW's frame, choose
+        ;; another one based on `delete-window-choose-selected'.  Note
+        ;; that both `window-at-x-y' and `get-mru-window' may fail to
+        ;; produce a suitable window in which case we will fall back on
+        ;; its frame's first window, chosen by `delete-window-internal'.
+        (cond
+         ((window-live-p frame-selected-window))
+         ((and frame-selected-window-pos
+               ;; We have a recorded position of point of the previously
+               ;; selected window.  Try to find the window that is now
+               ;; at that position.
+               (let ((new-frame-selected-window
+                     (window-at-x-y
+                       (+ (nth 0 frame-selected-window-edges)
+                          (car frame-selected-window-pos))
+                       (+ (nth 1 frame-selected-window-edges)
+                          (cdr frame-selected-window-pos))
+                       frame t)))
+                 (and new-frame-selected-window
+                      ;; Select window at WINDOW's position at point.
+                     (set-frame-selected-window
+                       frame new-frame-selected-window)))))
+         ((and (eq delete-window-choose-selected 'mru)
+               ;; Try to use the most recently used window.
+               (let ((mru-window (get-mru-window frame nil nil t)))
+                 (and mru-window
+                     (set-frame-selected-window frame mru-window)))))
+         ((and (window-parameter
+                (frame-selected-window frame) 'no-other-window)
+               ;; If `delete-window-internal' selected a window with a
+               ;; non-nil 'no-other-window' parameter as its frame's
+               ;; selected window, try to choose another one.
+               (catch 'found
+                 (walk-window-tree
+                  (lambda (other)
+                    (unless (window-parameter other 'no-other-window)
+                      (set-frame-selected-window frame other)
+                      (throw 'found t)))
+                  frame))))
+         (t
+          ;; Record the window chosen by `delete-window-internal'.
+          (set-frame-selected-window
+           frame (frame-selected-window frame))))
+
        (window--check frame)
        ;; Always return nil.
        nil))))
@@ -4361,43 +4463,45 @@ This may be a useful alternative binding for 
\\[delete-other-windows]
 
 ;; The following function is called by `set-window-buffer' _before_ it
 ;; replaces the buffer of the argument window with the new buffer.
+(defun push-window-buffer-onto-prev (&optional window)
+  "Push entry for WINDOW's buffer onto WINDOW's prev-buffers list.
+WINDOW must be a live window and defaults to the selected one.
+
+Any duplicate entries for the buffer in the list are removed."
+  (let* ((window (window-normalize-window window t))
+         (buffer (window-buffer window))
+         (w-list (window-prev-buffers window))
+         (entry (assq buffer w-list)))
+    (when entry
+      (setq w-list (assq-delete-all buffer w-list)))
+    (let ((start (window-start window))
+          (point (window-point window)))
+      (setq entry
+            (cons buffer
+                  (with-current-buffer buffer
+                    (if entry
+                        ;; We have an entry, update marker positions.
+                        (list (set-marker (nth 1 entry) start)
+                              (set-marker (nth 2 entry) point))
+                      (list (copy-marker start)
+                            (copy-marker
+                             ;; Preserve window-point-insertion-type
+                             ;; (Bug#12855)
+                             point window-point-insertion-type))))))
+      (set-window-prev-buffers window (cons entry w-list)))))
+
 (defun record-window-buffer (&optional window)
   "Record WINDOW's buffer.
 WINDOW must be a live window and defaults to the selected one."
   (let* ((window (window-normalize-window window t))
-        (buffer (window-buffer window))
-        (entry (assq buffer (window-prev-buffers window))))
+         (buffer (window-buffer window)))
     ;; Reset WINDOW's next buffers.  If needed, they are resurrected by
     ;; `switch-to-prev-buffer' and `switch-to-next-buffer'.
     (set-window-next-buffers window nil)
 
-    (when entry
-      ;; Remove all entries for BUFFER from WINDOW's previous buffers.
-      (set-window-prev-buffers
-       window (assq-delete-all buffer (window-prev-buffers window))))
-
     ;; Don't record insignificant buffers.
-    (when (or (not (eq (aref (buffer-name buffer) 0) ?\s))
-              (minibufferp buffer))
-      ;; Add an entry for buffer to WINDOW's previous buffers.
-      (with-current-buffer buffer
-       (let ((start (window-start window))
-             (point (window-point window)))
-         (setq entry
-               (cons buffer
-                     (if entry
-                         ;; We have an entry, update marker positions.
-                         (list (set-marker (nth 1 entry) start)
-                               (set-marker (nth 2 entry) point))
-                       ;; Make new markers.
-                       (list (copy-marker start)
-                             (copy-marker
-                              ;; Preserve window-point-insertion-type
-                              ;; (Bug#12855).
-                              point window-point-insertion-type)))))
-         (set-window-prev-buffers
-          window (cons entry (window-prev-buffers window)))))
-
+    (when (not (eq (aref (buffer-name buffer) 0) ?\s))
+      (push-window-buffer-onto-prev window)
       (run-hooks 'buffer-list-update-hook))))
 
 (defun unrecord-window-buffer (&optional window buffer)
@@ -4422,8 +4526,10 @@ point to POINT.  If WINDOW is selected this also sets 
BUFFER's
 before was current this also makes BUFFER the current buffer."
   (setq window (window-normalize-window window t))
   (let ((selected (eq window (selected-window)))
-       (current (eq (window-buffer window) (current-buffer))))
+       (current (eq (window-buffer window) (current-buffer)))
+        (dedicated-side (eq (window-dedicated-p window) 'side)))
     (set-window-buffer window buffer)
+    (and dedicated-side (set-window-dedicated-p window 'side))
     (when (and selected current)
       (set-buffer buffer))
     (when start
@@ -4557,11 +4663,11 @@ This function is called by `prev-buffer'."
       ;; Scan WINDOW's previous buffers first, skipping entries of next
       ;; buffers.
       (dolist (entry (window-prev-buffers window))
-       (when (and (setq new-buffer (car entry))
+       (when (and (not (eq (car entry) old-buffer))
+                   (setq new-buffer (car entry))
                   (or (buffer-live-p new-buffer)
                       (not (setq killed-buffers
                                  (cons new-buffer killed-buffers))))
-                  (not (eq new-buffer old-buffer))
                    (or (null pred) (funcall pred new-buffer))
                   ;; When BURY-OR-KILL is nil, avoid switching to a
                   ;; buffer in WINDOW's next buffers list.
@@ -4724,11 +4830,11 @@ This function is called by `next-buffer'."
       ;; Scan WINDOW's reverted previous buffers last (must not use
       ;; nreverse here!)
       (dolist (entry (reverse (window-prev-buffers window)))
-       (when (and (setq new-buffer (car entry))
+       (when (and (not (eq new-buffer (car entry)))
+                   (setq new-buffer (car entry))
                   (or (buffer-live-p new-buffer)
                       (not (setq killed-buffers
                                  (cons new-buffer killed-buffers))))
-                  (not (eq new-buffer old-buffer))
                    (or (null pred) (funcall pred new-buffer)))
           (if (switch-to-prev-buffer-skip-p skip window new-buffer)
              (setq skipped (or skipped new-buffer))
@@ -4955,9 +5061,10 @@ window's lists of previous and next buffers."
        (all-frames (cond ((not frame) t) ((eq frame t) nil) (t frame))))
     (dolist (window (window-list-1 nil nil all-frames))
       (if (eq (window-buffer window) buffer)
-         (let ((deletable (window-deletable-p window)))
+         (let ((deletable (window-deletable-p window))
+                (dedicated (window-dedicated-p window)))
            (cond
-            ((and (eq deletable 'frame) (window-dedicated-p window))
+            ((and (eq deletable 'frame) dedicated)
              ;; Delete frame if and only if window is dedicated.
              (delete-frame (window-frame window)))
             ((eq deletable t)
@@ -4966,7 +5073,10 @@ window's lists of previous and next buffers."
             (t
              ;; In window switch to previous buffer.
              (set-window-dedicated-p window nil)
-             (switch-to-prev-buffer window 'bury))))
+             (switch-to-prev-buffer window 'bury)
+              ;; Restore the dedicated 'side' flag.
+              (when (eq dedicated 'side)
+                (set-window-dedicated-p window 'side)))))
        ;; If a window doesn't show BUFFER, unrecord BUFFER in it.
        (unrecord-window-buffer window buffer)))))
 
@@ -4975,10 +5085,10 @@ window's lists of previous and next buffers."
 BUFFER-OR-NAME may be a buffer or the name of an existing buffer
 and defaults to the current buffer.
 
-When a window showing BUFFER-OR-NAME is dedicated, that window is
-deleted.  If that window is the only window on its frame, the
-frame is deleted too when there are other frames left.  If there
-are no other frames left, some other buffer is displayed in that
+With the exception of side windows, when a window showing BUFFER-OR-NAME
+is dedicated, that window is deleted.  If that window is the only window
+on its frame, the frame is deleted too when there are other frames left.
+If there are no other frames left, some other buffer is displayed in that
 window.
 
 This function removes the buffer denoted by BUFFER-OR-NAME from
@@ -4987,10 +5097,14 @@ all window-local buffer lists."
   (let ((buffer (window-normalize-buffer buffer-or-name)))
     (dolist (window (window-list-1 nil nil t))
       (if (eq (window-buffer window) buffer)
-         (unless (window--delete window t t)
-           ;; Switch to another buffer in window.
-           (set-window-dedicated-p window nil)
-           (switch-to-prev-buffer window 'kill))
+          ;; Delete a dedicated window unless it is a side window.
+          (let ((dedicated-side (eq (window-dedicated-p window) 'side)))
+            (when (or dedicated-side (not (window--delete window t t)))
+              ;; Switch to another buffer in that window.
+              (set-window-dedicated-p window nil)
+              (if (switch-to-prev-buffer window 'kill)
+                  (and dedicated-side (set-window-dedicated-p window 'side))
+                (window--delete window nil 'kill))))
        ;; Unrecord BUFFER in WINDOW.
        (unrecord-window-buffer window buffer)))))
 
@@ -5012,6 +5126,10 @@ buffer.  If WINDOW is not deleted, reset its 
`quit-restore'
 parameter to nil.  See Info node `(elisp) Quitting Windows' for
 more details.
 
+If WINDOW's dedicated flag is t, try to delete WINDOW.  If it
+equals the value 'side', restore that value when WINDOW is not
+deleted.
+
 Optional second argument BURY-OR-KILL tells how to proceed with
 the buffer of WINDOW.  The following values are handled:
 
@@ -5034,16 +5152,16 @@ nil means to not handle the buffer in a particular way. 
 This
   (setq window (window-normalize-window window t))
   (let* ((buffer (window-buffer window))
         (quit-restore (window-parameter window 'quit-restore))
-        (prev-buffer
-         (let* ((prev-buffers (window-prev-buffers window))
-                (prev-buffer (caar prev-buffers)))
-           (and (or (not (eq prev-buffer buffer))
-                    (and (cdr prev-buffers)
-                         (not (eq (setq prev-buffer (cadr prev-buffers))
-                                  buffer))))
-                prev-buffer)))
+         (prev-buffer (catch 'prev-buffer
+                        (dolist (buf (window-prev-buffers window))
+                          (unless (eq (car buf) buffer)
+                            (throw 'prev-buffer (car buf))))))
+         (dedicated (window-dedicated-p window))
         quad entry)
     (cond
+     ;; First try to delete dedicated windows that are not side windows.
+     ((and dedicated (not (eq dedicated 'side))
+           (window--delete window 'dedicated (eq bury-or-kill 'kill))))
      ((and (not prev-buffer)
           (eq (nth 1 quit-restore) 'tab)
           (eq (nth 3 quit-restore) buffer))
@@ -5086,6 +5204,9 @@ nil means to not handle the buffer in a particular way.  
This
       ;; Restore WINDOW's previous buffer, start and point position.
       (set-window-buffer-start-and-point
        window (nth 0 quad) (nth 1 quad) (nth 2 quad))
+      ;; Restore the 'side' dedicated flag as well.
+      (when (eq dedicated 'side)
+        (set-window-dedicated-p window 'side))
       ;; Deal with the buffer we just removed from WINDOW.
       (setq entry (and (eq bury-or-kill 'append)
                       (assq buffer (window-prev-buffers window))))
@@ -5112,7 +5233,14 @@ nil means to not handle the buffer in a particular way.  
This
       (set-window-parameter window 'quit-restore nil)
       ;; Make sure that WINDOW is no more dedicated.
       (set-window-dedicated-p window nil)
-      (switch-to-prev-buffer window bury-or-kill)))
+      ;; Try to switch to a previous buffer.  Delete the window only if
+      ;; that is not possible (Bug#48367).
+      (if (switch-to-prev-buffer window bury-or-kill)
+          (when (eq dedicated 'side)
+            (set-window-dedicated-p window 'side))
+        (window--delete window nil (eq bury-or-kill 'kill))
+        (when (window-live-p (nth 2 quit-restore))
+          (select-window (nth 2 quit-restore))))))
 
     ;; Deal with the buffer.
     (cond
@@ -8633,11 +8761,14 @@ meaning of these values in `window--display-buffer'.
 Optional `post-function' is called after the buffer is displayed in the
 window; the function takes two arguments: an old and new window.
 Optional string argument `echo' can be used to add a prefix to the
-command echo keystrokes that should describe the current prefix state."
+command echo keystrokes that should describe the current prefix state.
+This returns an \"exit function\", which can be called with no argument
+to deactivate this overriding action."
   (let* ((old-window (or (minibuffer-selected-window) (selected-window)))
          (new-window nil)
          (minibuffer-depth (minibuffer-depth))
          (clearfun (make-symbol "clear-display-buffer-overriding-action"))
+         (postfun (make-symbol "post-display-buffer-override-next-command"))
          (action (lambda (buffer alist)
                    (unless (> (minibuffer-depth) minibuffer-depth)
                      (let* ((ret (funcall pre-function buffer alist))
@@ -8646,22 +8777,24 @@ command echo keystrokes that should describe the 
current prefix state."
                        (setq new-window (window--display-buffer buffer window
                                                                 type alist))
                        ;; Reset display-buffer-overriding-action
-                       ;; after the first buffer display action
+                       ;; after the first display-buffer action (bug#39722).
                        (funcall clearfun)
-                       (setq post-function nil)
                        new-window))))
          (command this-command)
          (echofun (when echo (lambda () echo)))
          (exitfun
           (lambda ()
-            (setcar display-buffer-overriding-action
-                    (delq action (car display-buffer-overriding-action)))
-            (remove-hook 'post-command-hook clearfun)
+            (funcall clearfun)
+            (remove-hook 'post-command-hook postfun)
             (remove-hook 'prefix-command-echo-keystrokes-functions echofun)
             (when (functionp post-function)
               (funcall post-function old-window new-window)))))
     (fset clearfun
           (lambda ()
+            (setcar display-buffer-overriding-action
+                    (delq action (car display-buffer-overriding-action)))))
+    (fset postfun
+          (lambda ()
             (unless (or
                     ;; Remove the hook immediately
                     ;; after exiting the minibuffer.
@@ -8670,12 +8803,12 @@ command echo keystrokes that should describe the 
current prefix state."
                     ;; adding the hook by the same command below.
                     (eq this-command command))
               (funcall exitfun))))
-    ;; Reset display-buffer-overriding-action
-    ;; after the next command finishes
-    (add-hook 'post-command-hook clearfun)
+    ;; Call post-function after the next command finishes (bug#49057).
+    (add-hook 'post-command-hook postfun)
     (when echofun
       (add-hook 'prefix-command-echo-keystrokes-functions echofun))
-    (push action (car display-buffer-overriding-action))))
+    (push action (car display-buffer-overriding-action))
+    exitfun))
 
 
 (defun set-window-text-height (window height)
@@ -8785,7 +8918,11 @@ font on WINDOW's frame."
   (let* ((window (window-normalize-window window t))
         (frame (window-frame window))
         (default-font (face-font 'default frame)))
-    (if (and (display-multi-font-p (frame-parameter frame 'display))
+    ;; Client frames can have the 'display' parameter set like for X
+    ;; frames, even though they are TTY frames, so make sure we won't
+    ;; be duped by that up front with 'framep'.
+    (if (and (not (eq (framep frame) t))
+             (display-multi-font-p (frame-parameter frame 'display))
             (not (string-equal (frame-parameter frame 'font) default-font)))
         (aref (font-info default-font frame) 3)
       (frame-char-height frame))))
@@ -10048,6 +10185,9 @@ is active.  This function is run by 
`mouse-autoselect-window-timer'."
                 ;; already selected.
                 (and (not (eq frame (selected-frame)))
                      (frame-parameter frame 'no-accept-focus))
+                ;; Don't switch if window autoselection with mouse is active
+                ;; and minibuffer window is selected.
+                (and mouse-autoselect-window (window-minibuffer-p))
                 ;; Don't switch to minibuffer window unless it's active.
                 (and (window-minibuffer-p window)
                      (not (minibuffer-window-active-p window))))
diff --git a/lisp/xdg.el b/lisp/xdg.el
index 1103949..0bdfd11 100644
--- a/lisp/xdg.el
+++ b/lisp/xdg.el
@@ -231,7 +231,7 @@ admin config, and finally system cached associations."
         (desktop (getenv "XDG_CURRENT_DESKTOP"))
         res)
     (when desktop
-      (setq desktop (format "%s-mimeapps.list" desktop)))
+      (setq desktop (list (format "%s-mimeapps.list" desktop))))
     (dolist (name (cons "mimeapps.list" desktop))
       (push (expand-file-name name (xdg-config-home)) res)
       (push (expand-file-name (format "applications/%s" name) (xdg-data-home))
diff --git a/lwlib/Makefile.in b/lwlib/Makefile.in
index ce77789..fb0ae0e 100644
--- a/lwlib/Makefile.in
+++ b/lwlib/Makefile.in
@@ -93,9 +93,9 @@ globals_h = ../src/globals.h
 $(globals_h):
        $(MAKE) -C ../src globals.h
 
-.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean extraclean
+.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
 
-clean mostlyclean extraclean:
+clean mostlyclean:
        rm -f ./*.o liblw.a \#* $(DEPDIR)/*
 
 distclean: clean
diff --git a/make-dist b/make-dist
index 606fdd9..7074bb8 100755
--- a/make-dist
+++ b/make-dist
@@ -52,7 +52,6 @@ make_tar=no
 default_gzip=gzip
 newer=""
 with_info=yes
-with_tests=yes
 changelog=yes
 verbose=no
 
@@ -109,16 +108,10 @@ while [ $# -gt 0 ]; do
       update=no
      ;;
 
-    ## Include the test/ directory.
-    ## This is for backward compatibility to when --no-tests was the default.
-    "--tests")
-      with_tests=yes
+    "--tests"|"--no-tests")
+      echo "The option $1 no longer does anything"
      ;;
 
-    ## Exclude the test/ directory.
-    "--no-tests")
-      with_tests=no
-     ;;
 
     "--verbose")
       verbose=yes
@@ -136,7 +129,6 @@ while [ $# -gt 0 ]; do
       echo "  --no-update      don't recompile or do analogous things"
       echo "  --no-changelog   don't generate the top-level ChangeLog"
       echo "  --no-info                don't include info files"
-      echo "  --no-tests       don't include the test/ directory"
       echo "  --snapshot       same as --clean-up --no-update --tar"
       echo "  --tar            make a tar file"
       echo "  --verbose                noisier output"
@@ -402,11 +394,7 @@ manifest=MANIFEST
 # if .git is present.
 if ( [ $update = yes ] || [ ! -f $manifest ] ) && [ -r .git ]; then
   echo "Updating $manifest"
-  if [ $with_tests = yes ]; then
-    git ls-files > $manifest
-  else
-    git ls-files | grep -v '^test' >$manifest
-  fi || exit
+  git ls-files > $manifest || exit
   printf '%s\n' $possibly_non_vc_files $info_files >>$manifest || exit
   sort -u -o $manifest $manifest || exit
 fi
diff --git a/nextstep/Makefile.in b/nextstep/Makefile.in
index 3168fee..42b2ab2 100644
--- a/nextstep/Makefile.in
+++ b/nextstep/Makefile.in
@@ -36,6 +36,7 @@ MKDIR_P = @MKDIR_P@
 ns_appdir = @ns_appdir@
 ## GNUstep: ns_appdir; macOS: ns_appdir/Contents/MacOS
 ns_appbindir = @ns_appbindir@
+ns_applibexecdir = @ns_applibexecdir@
 ## GNUstep/Emacs.base or Cocoa/Emacs.base.
 ns_appsrc = @ns_appsrc@
 ## GNUstep: GNUstep/Emacs.base/Resources/Info-gnustep.plist
@@ -44,7 +45,7 @@ ns_check_file = @ns_appdir@/@ns_check_file@
 
 .PHONY: all
 
-all: ${ns_appdir} ${ns_appbindir}/Emacs ${ns_appbindir}/Emacs.pdmp
+all: ${ns_appdir} ${ns_appbindir}/Emacs ${ns_applibexecdir}/Emacs.pdmp
 
 ${ns_check_file} ${ns_appdir}: ${srcdir}/${ns_appsrc} ${ns_appsrc}
        rm -rf ${ns_appdir}
@@ -63,8 +64,10 @@ ${ns_appbindir}/Emacs: ${ns_appdir} ${ns_check_file} 
../src/emacs${EXEEXT}
        ${MKDIR_P} ${ns_appbindir}
        cp -f ../src/emacs${EXEEXT} $@
 
-${ns_appbindir}/Emacs.pdmp: ${ns_appdir} ${ns_check_file} 
../src/emacs${EXEEXT}.pdmp
-       ${MKDIR_P} ${ns_appbindir}
+# FIXME: Don't install the dump file into the app bundle when
+# self-contained install is disabled.
+${ns_applibexecdir}/Emacs.pdmp: ${ns_appdir} ${ns_check_file} 
../src/emacs${EXEEXT}.pdmp
+       ${MKDIR_P} ${ns_applibexecdir}
        cp -f ../src/emacs${EXEEXT}.pdmp $@
 
 .PHONY: FORCE
@@ -85,9 +88,8 @@ links: ../src/emacs${EXEEXT}
        ln -s $(top_srcdir_abs)/info ${ns_appdir}/Contents/Resources
        ${MKDIR_P} ${ns_appbindir}
        ln -s $(abs_top_builddir)/src/emacs${EXEEXT} ${ns_appbindir}/Emacs
-       ln -s $(abs_top_builddir)/src/emacs${EXEEXT}.pdmp 
${ns_appbindir}/Emacs.pdmp
        ln -s $(abs_top_builddir)/lib-src ${ns_appbindir}/bin
-       ln -s $(abs_top_builddir)/lib-src ${ns_appbindir}/libexec
+       ln -s $(abs_top_builddir)/lib-src ${ns_applibexecdir}
        ${MKDIR_P} ${ns_appdir}/Contents/Resources/etc
        for f in $(shell cd $(top_srcdir_abs)/etc; ls); do ln -s 
$(top_srcdir_abs)/etc/$$f ${ns_appdir}/Contents/Resources/etc; done
        ln -s $(abs_top_builddir)/etc/DOC ${ns_appdir}/Contents/Resources/etc
diff --git a/nt/Makefile.in b/nt/Makefile.in
index 0d44890..3274ff9 100644
--- a/nt/Makefile.in
+++ b/nt/Makefile.in
@@ -170,7 +170,7 @@ $(DESTDIR)${archlibdir}: all
         fi
 
 .PHONY: install uninstall mostlyclean clean distclean maintainer-clean
-.PHONY: bootstrap-clean extraclean check tags
+.PHONY: bootstrap-clean check tags
 
 install: $(DESTDIR)${archlibdir}
        @echo
@@ -203,9 +203,6 @@ distclean: clean
 bootstrap-clean maintainer-clean: distclean
        true
 
-extraclean: maintainer-clean
-       -rm -f *~ \#*
-
 ## Test the contents of the directory.
 check:
        @echo "We don't have any tests for the nt/ directory yet."
diff --git a/nt/mingw-cfg.site b/nt/mingw-cfg.site
index 431fdab..6ab81e9 100644
--- a/nt/mingw-cfg.site
+++ b/nt/mingw-cfg.site
@@ -90,8 +90,9 @@ ac_cv_func_readlinkat=yes
 ac_cv_func_faccessat=yes
 # Avoid compiling Gnulib's canonicalize-lgpl.c, which fails
 ac_cv_func_canonicalize_file_name=yes
-ac_cv_func_realpath="not-needed"
-gl_cv_func_realpath_works="no-but-not-needed-so-yes"
+# Implemented in w32.c
+ac_cv_func_realpath=yes
+gl_cv_func_realpath_works=yes
 # Implemented in w32.c
 ac_cv_func_fcntl=yes
 gl_cv_func_fcntl_f_dupfd_cloexec=yes
diff --git a/src/Makefile.in b/src/Makefile.in
index b8bad73..22c7aee 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -55,7 +55,7 @@ lwlibdir = ../lwlib
 # Configuration files for .o files to depend on.
 config_h = config.h $(srcdir)/conf_post.h
 
-## ns-app if HAVE_NS, else empty.
+## ns-app if NS self contained app, else empty.
 OTHER_FILES = @OTHER_FILES@
 
 ## Flags to pass for profiling builds
@@ -342,7 +342,7 @@ DUMPING=@DUMPING@
 CHECK_STRUCTS = @CHECK_STRUCTS@
 HAVE_PDUMPER = @HAVE_PDUMPER@
 
-## ARM Macs require that all code have a valid signature.  Since pump
+## ARM Macs require that all code have a valid signature.  Since pdump
 ## invalidates the signature, we must re-sign to fix it.
 DO_CODESIGN=$(patsubst aarch64-apple-darwin%,yes,@configuration@)
 
@@ -671,7 +671,7 @@ ns-app: emacs$(EXEEXT) $(pdmp)
        $(MAKE) -C ../nextstep all
 
 .PHONY: mostlyclean clean bootstrap-clean distclean maintainer-clean
-.PHONY: versionclean extraclean
+.PHONY: versionclean
 
 mostlyclean:
        rm -f temacs$(EXEEXT) core ./*.core \#* ./*.o
@@ -706,9 +706,6 @@ distclean: bootstrap-clean
 
 maintainer-clean: distclean
        rm -f TAGS
-extraclean: distclean
-       rm -f ./*~ \#* TAGS config.in
-
 
 ETAGS = ../lib-src/etags${EXEEXT}
 
diff --git a/src/buffer.c b/src/buffer.c
index 8e33162..565577e 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5390,17 +5390,24 @@ init_buffer (void)
         recorded by temacs, that cannot be used by the dumped Emacs.
         We map new memory for their text here.
 
-        Implementation note: the buffers we carry from temacs are:
+        Implementation notes: the buffers we carry from temacs are:
         " prin1", "*scratch*", " *Minibuf-0*", "*Messages*", and
         " *code-conversion-work*".  They are created by
         init_buffer_once and init_window_once (which are not called
-        in the dumped Emacs), and by the first call to coding.c routines.  */
+        in the dumped Emacs), and by the first call to coding.c
+        routines.  Since FOR_EACH_LIVE_BUFFER only walks the buffers
+        in Vbuffer_alist, any buffer we carry from temacs that is
+        not in the alist (a.k.a. "magic invisible buffers") should
+        be handled here explicitly.  */
       FOR_EACH_LIVE_BUFFER (tail, buffer)
         {
          struct buffer *b = XBUFFER (buffer);
          b->text->beg = NULL;
          enlarge_buffer_text (b, 0);
        }
+      /* The " prin1" buffer is not in Vbuffer_alist.  */
+      XBUFFER (Vprin1_to_string_buffer)->text->beg = NULL;
+      enlarge_buffer_text (XBUFFER (Vprin1_to_string_buffer), 0);
     }
 #endif /* USE_MMAP_FOR_BUFFERS */
 
@@ -5666,15 +5673,18 @@ Linefeed indents to this column in Fundamental mode.  
*/);
   DEFVAR_PER_BUFFER ("tab-width", &BVAR (current_buffer, tab_width),
                     Qintegerp,
                     doc: /* Distance between tab stops (for display of tab 
characters), in columns.
-NOTE: This controls the display width of a TAB character, and not
-the size of an indentation step.
-This should be an integer greater than zero.  */);
+This controls the width of a TAB character on display.
+The value should be a positive integer.
+Note that this variable doesn't necessarily affect the size of the
+indentation step.  However, if the major mode's indentation facility
+inserts one or more TAB characters, this variable will affect the
+indentation step as well, even if `indent-tabs-mode' is non-nil.  */);
 
   DEFVAR_PER_BUFFER ("ctl-arrow", &BVAR (current_buffer, ctl_arrow), Qnil,
-                    doc: /* Non-nil means display control chars with uparrow.
-A value of nil means use backslash and octal digits.
-This variable does not apply to characters whose display is specified
-in the current display table (if there is one).  */);
+                    doc: /* Non-nil means display control chars with uparrow 
`^'.
+A value of nil means use backslash `\\' and octal digits.
+This variable does not apply to characters whose display is specified in
+the current display table (if there is one; see `standard-display-table').  
*/);
 
   DEFVAR_PER_BUFFER ("enable-multibyte-characters",
                     &BVAR (current_buffer, enable_multibyte_characters),
diff --git a/src/callproc.c b/src/callproc.c
index 5aa2cba..aabc393 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -276,6 +276,9 @@ usage: (call-process PROGRAM &optional INFILE DESTINATION 
DISPLAY &rest ARGS)  *
   else
     infile = build_string (NULL_DEVICE);
 
+  /* Remove "/:" from INFILE.  */
+  infile = remove_slash_colon (infile);
+
   encoded_infile = ENCODE_FILE (infile);
 
   filefd = emacs_open (SSDATA (encoded_infile), O_RDONLY, 0);
@@ -439,9 +442,15 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int 
filefd,
   current_dir = encode_current_directory ();
 
   if (STRINGP (error_file))
-    error_file = ENCODE_FILE (error_file);
+    {
+      error_file = remove_slash_colon (error_file);
+      error_file = ENCODE_FILE (error_file);
+    }
   if (STRINGP (output_file))
-    output_file = ENCODE_FILE (output_file);
+    {
+      output_file = remove_slash_colon (output_file);
+      output_file = ENCODE_FILE (output_file);
+    }
 
   display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
 
@@ -1652,32 +1661,15 @@ make_environment_block (Lisp_Object current_dir)
 void
 init_callproc_1 (void)
 {
-#ifdef HAVE_NS
-  const char *etc_dir = ns_etc_directory ();
-  const char *path_exec = ns_exec_path ();
-#endif
-
-  Vdata_directory = decode_env_path ("EMACSDATA",
-#ifdef HAVE_NS
-                                             etc_dir ? etc_dir :
-#endif
-                                             PATH_DATA, 0);
+  Vdata_directory = decode_env_path ("EMACSDATA", PATH_DATA, 0);
   Vdata_directory = Ffile_name_as_directory (Fcar (Vdata_directory));
 
-  Vdoc_directory = decode_env_path ("EMACSDOC",
-#ifdef HAVE_NS
-                                             etc_dir ? etc_dir :
-#endif
-                                             PATH_DOC, 0);
+  Vdoc_directory = decode_env_path ("EMACSDOC", PATH_DOC, 0);
   Vdoc_directory = Ffile_name_as_directory (Fcar (Vdoc_directory));
 
   /* Check the EMACSPATH environment variable, defaulting to the
      PATH_EXEC path from epaths.h.  */
-  Vexec_path = decode_env_path ("EMACSPATH",
-#ifdef HAVE_NS
-                                path_exec ? path_exec :
-#endif
-                                PATH_EXEC, 0);
+  Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC, 0);
   Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
   /* FIXME?  For ns, path_exec should go at the front?  */
   Vexec_path = nconc2 (decode_env_path ("PATH", "", 0), Vexec_path);
@@ -1692,10 +1684,6 @@ init_callproc (void)
 
   char *sh;
   Lisp_Object tempdir;
-#ifdef HAVE_NS
-  if (data_dir == 0)
-    data_dir = ns_etc_directory () != 0;
-#endif
 
   if (!NILP (Vinstallation_directory))
     {
@@ -1707,15 +1695,8 @@ init_callproc (void)
          /* MSDOS uses wrapped binaries, so don't do this.  */
       if (NILP (Fmember (tem, Vexec_path)))
        {
-#ifdef HAVE_NS
-         const char *path_exec = ns_exec_path ();
-#endif
          /* Running uninstalled, so default to tem rather than PATH_EXEC.  */
-         Vexec_path = decode_env_path ("EMACSPATH",
-#ifdef HAVE_NS
-                                       path_exec ? path_exec :
-#endif
-                                       SSDATA (tem), 0);
+         Vexec_path = decode_env_path ("EMACSPATH", SSDATA (tem), 0);
          Vexec_path = nconc2 (decode_env_path ("PATH", "", 0), Vexec_path);
        }
 
diff --git a/src/character.c b/src/character.c
index 41abb83..38a81d3 100644
--- a/src/character.c
+++ b/src/character.c
@@ -34,6 +34,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "lisp.h"
 #include "character.h"
 #include "buffer.h"
+#include "frame.h"
 #include "dispextern.h"
 #include "composite.h"
 #include "disptab.h"
@@ -327,22 +328,31 @@ strwidth (const char *str, ptrdiff_t len)
    compositions.  If PRECISION > 0, return the width of longest
    substring that doesn't exceed PRECISION, and set number of
    characters and bytes of the substring in *NCHARS and *NBYTES
-   respectively.  FROM and TO are zero-based character indices
-   that define the substring of STRING to consider.  */
+   respectively.  FROM and TO are zero-based character indices that
+   define the substring of STRING to consider.  If AUTO_COMP is
+   non-zero, account for automatic compositions in STRING.  */
 
 ptrdiff_t
 lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
-                  ptrdiff_t precision, ptrdiff_t *nchars, ptrdiff_t *nbytes)
+                  ptrdiff_t precision, ptrdiff_t *nchars, ptrdiff_t *nbytes,
+                  bool auto_comp)
 {
   /* This set multibyte to 0 even if STRING is multibyte when it
      contains only ascii and eight-bit-graphic, but that's
      intentional.  */
   bool multibyte = SCHARS (string) < SBYTES (string);
-  unsigned char *str = SDATA (string);
   ptrdiff_t i = from, i_byte = from ? string_char_to_byte (string, from) : 0;
   ptrdiff_t from_byte = i_byte;
   ptrdiff_t width = 0;
   struct Lisp_Char_Table *dp = buffer_display_table ();
+#ifdef HAVE_WINDOW_SYSTEM
+  struct frame *f =
+    (FRAMEP (selected_frame) && FRAME_LIVE_P (XFRAME (selected_frame)))
+    ? XFRAME (selected_frame)
+    : NULL;
+  int font_width = -1;
+  Lisp_Object default_font, frame_font;
+#endif
 
   eassert (precision <= 0 || (nchars && nbytes));
 
@@ -361,9 +371,53 @@ lisp_string_width (Lisp_Object string, ptrdiff_t from, 
ptrdiff_t to,
          chars = end - i;
          bytes = string_char_to_byte (string, end) - i_byte;
        }
+#ifdef HAVE_WINDOW_SYSTEM
+      else if (auto_comp
+              && f && FRAME_WINDOW_P (f)
+              && multibyte
+              && find_automatic_composition (i, -1, i, &ignore,
+                                             &end, &val, string)
+              && end > i)
+       {
+         int j;
+         for (j = 0; j < LGSTRING_GLYPH_LEN (val); j++)
+           if (NILP (LGSTRING_GLYPH (val, j)))
+             break;
+
+         int pixelwidth = composition_gstring_width (val, 0, j, NULL);
+
+         /* The below is somewhat expensive, so compute it only once
+            for the entire loop, and only if needed.  */
+         if (font_width < 0)
+           {
+             font_width = FRAME_COLUMN_WIDTH (f);
+             default_font = Fface_font (Qdefault, Qnil, Qnil);
+             frame_font = Fframe_parameter (Qnil, Qfont);
+
+             if (STRINGP (default_font) && STRINGP (frame_font)
+                 && (SCHARS (default_font) != SCHARS (frame_font)
+                     || SBYTES (default_font) != SBYTES (frame_font)
+                     || memcmp (SDATA (default_font), SDATA (frame_font),
+                                SBYTES (default_font))))
+               {
+                 Lisp_Object font_info = Ffont_info (default_font, Qnil);
+                 if (VECTORP (font_info))
+                   {
+                     font_width = XFIXNUM (AREF (font_info, 11));
+                     if (font_width <= 0)
+                       font_width = XFIXNUM (AREF (font_info, 10));
+                   }
+               }
+           }
+         thiswidth = (double) pixelwidth / font_width + 0.5;
+         chars = end - i;
+         bytes = string_char_to_byte (string, end) - i_byte;
+       }
+#endif /* HAVE_WINDOW_SYSTEM */
       else
        {
          int c;
+         unsigned char *str = SDATA (string);
 
          if (multibyte)
            {
@@ -421,7 +475,7 @@ usage: (string-width STRING &optional FROM TO)  */)
 
   CHECK_STRING (str);
   validate_subarray (str, from, to, SCHARS (str), &ifrom, &ito);
-  XSETFASTINT (val, lisp_string_width (str, ifrom, ito, -1, NULL, NULL));
+  XSETFASTINT (val, lisp_string_width (str, ifrom, ito, -1, NULL, NULL, true));
   return val;
 }
 
diff --git a/src/character.h b/src/character.h
index 75351cd..1a74548 100644
--- a/src/character.h
+++ b/src/character.h
@@ -573,7 +573,7 @@ extern ptrdiff_t strwidth (const char *, ptrdiff_t);
 extern ptrdiff_t c_string_width (const unsigned char *, ptrdiff_t, int,
                                 ptrdiff_t *, ptrdiff_t *);
 extern ptrdiff_t lisp_string_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
-                                   ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+                                   ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
 
 extern Lisp_Object Vchar_unify_table;
 extern Lisp_Object string_escape_byte8 (Lisp_Object);
diff --git a/src/comp.c b/src/comp.c
index a4dba43..c380346 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -744,8 +744,34 @@ hash_native_abi (void)
                        Vsystem_configuration_options),
               Fmapconcat (intern_c_string ("comp--subr-signature"),
                           Vcomp_subr_list, build_string (""))));
+
+  Lisp_Object version = Vemacs_version;
+
+#ifdef NS_SELF_CONTAINED
+  /* MacOS self contained app bundles do not like having dots in the
+     directory names under the Contents/Frameworks directory, so
+     convert them to underscores.  */
+  version = STRING_MULTIBYTE (Vemacs_version)
+    ? make_uninit_multibyte_string (SCHARS (Vemacs_version),
+                                   SBYTES (Vemacs_version))
+    : make_uninit_string (SBYTES (Vemacs_version));
+
+  const unsigned char *from = SDATA (Vemacs_version);
+  unsigned char *to = SDATA (version);
+
+  while (from < SDATA (Vemacs_version) + SBYTES (Vemacs_version))
+    {
+      unsigned char c = *from++;
+
+      if (c == '.')
+       c = '_';
+
+      *to++ = c;
+    }
+#endif
+
   Vcomp_native_version_dir =
-    concat3 (Vemacs_version, build_string ("-"), Vcomp_abi_hash);
+    concat3 (version, build_string ("-"), Vcomp_abi_hash);
 }
 
 static void
@@ -2687,7 +2713,7 @@ declare_runtime_imported_funcs (void)
   Lisp_Object field_list = Qnil;
 
 #define ADD_IMPORTED(f_name, ret_type, nargs, args)                           \
-  {                                                                           \
+  do {                                                                        \
     Lisp_Object name = intern_c_string (STR (f_name));                        \
     Lisp_Object field =                                                        
       \
       make_mint_ptr (declare_imported_func (name, ret_type, nargs, args));     
\
@@ -2745,8 +2771,8 @@ emit_ctxt_code (void)
 {
   /* Emit optimize qualities.  */
   Lisp_Object opt_qly[] =
-    { Fcons (Qcomp_speed, make_fixnum (comp.speed)),
-      Fcons (Qcomp_debug, make_fixnum (comp.debug)),
+    { Fcons (Qnative_comp_speed, make_fixnum (comp.speed)),
+      Fcons (Qnative_comp_debug, make_fixnum (comp.debug)),
       Fcons (Qgccjit,
             Fcomp_libgccjit_version ()) };
   emit_static_object (TEXT_OPTIM_QLY_SYM, Flist (ARRAYELTS (opt_qly), 
opt_qly));
@@ -4008,15 +4034,16 @@ DEFUN ("comp-el-to-eln-rel-filename", 
Fcomp_el_to_eln_rel_filename,
 {
   CHECK_STRING (filename);
 
-  /* Use `file-truename' or fall back to `expand-file-name' when the
-     first is not available (bug#44701).
-
-     `file-truename' is not available only for a short phases of the
-     bootstrap before file.el is loaded, given we do not symlink
-     inside the build directory this should work.  */
-  filename = NILP (Ffboundp (intern_c_string ("file-truename")))
-    ? Fexpand_file_name (filename, Qnil)
-    : CALL1I (file-truename, filename);
+  /* Resolve possible symlinks in FILENAME, so that path_hash below
+     always compares equal. (Bug#44701).  */
+  filename = Fexpand_file_name (filename, Qnil);
+  char *file_normalized = realpath (SSDATA (ENCODE_FILE (filename)), NULL);
+  if (file_normalized)
+    {
+      filename = DECODE_FILE (make_unibyte_string (file_normalized,
+                                                  strlen (file_normalized)));
+      xfree (file_normalized);
+    }
 
   if (NILP (Ffile_exists_p (filename)))
     xsignal1 (Qfile_missing, filename);
@@ -4056,7 +4083,8 @@ DEFUN ("comp-el-to-eln-rel-filename", 
Fcomp_el_to_eln_rel_filename,
       Lisp_Object sys_re =
        concat2 (build_string ("\\`[[:ascii:]]+"),
                 Fregexp_quote (build_string ("/" PATH_REL_LOADSEARCH "/")));
-      Lisp_Object dump_load_search = build_string (PATH_DUMPLOADSEARCH "/");
+      Lisp_Object dump_load_search =
+       Fexpand_file_name (build_string (PATH_DUMPLOADSEARCH "/"), Qnil);
 #ifdef WINDOWSNT
       dump_load_search = Fw32_long_file_name (dump_load_search);
 #endif
@@ -4095,11 +4123,11 @@ directory in `comp-eln-load-path' otherwise.  */)
   Lisp_Object source_filename = filename;
   filename = Fcomp_el_to_eln_rel_filename (filename);
 
-  /* If base_dir was not specified search inside Vcomp_eln_load_path
+  /* If base_dir was not specified search inside Vnative_comp_eln_load_path
      for the first directory where we have write access.  */
   if (NILP (base_dir))
     {
-      Lisp_Object eln_load_paths = Vcomp_eln_load_path;
+      Lisp_Object eln_load_paths = Vnative_comp_eln_load_path;
       FOR_EACH_TAIL (eln_load_paths)
        {
          Lisp_Object dir = XCAR (eln_load_paths);
@@ -4358,7 +4386,7 @@ DEFUN ("comp-native-driver-options-effective-p",
 static void
 add_driver_options (void)
 {
-  Lisp_Object options = Fsymbol_value (Qcomp_native_driver_options);
+  Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
 
 #if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option) \
   || defined (WINDOWSNT)
@@ -4630,7 +4658,7 @@ void
 eln_load_path_final_clean_up (void)
 {
 #ifdef WINDOWSNT
-  Lisp_Object dir_tail = Vcomp_eln_load_path;
+  Lisp_Object dir_tail = Vnative_comp_eln_load_path;
   FOR_EACH_TAIL (dir_tail)
     {
       Lisp_Object files_in_dir =
@@ -4697,7 +4725,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
   if (!load_gccjit_if_necessary (false))
     return;
 
-  if (!comp_deferred_compilation
+  if (!native_comp_deferred_compilation
       || noninteractive
       || !NILP (Vpurify_flag)
       || !COMPILEDP (definition)
@@ -4755,7 +4783,7 @@ void
 fixup_eln_load_path (Lisp_Object eln_filename)
 {
   Lisp_Object last_cell = Qnil;
-  Lisp_Object tem = Vcomp_eln_load_path;
+  Lisp_Object tem = Vnative_comp_eln_load_path;
   FOR_EACH_TAIL (tem)
     if (CONSP (tem))
       last_cell = tem;
@@ -4856,7 +4884,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, 
bool loading_dump,
     /* 'dlopen' returns the same handle when trying to load two times
        the same shared.  In this case touching 'd_reloc' etc leads to
        fails in case a frame with a reference to it in a live reg is
-       active (comp-speed > 0).
+       active (native-comp-speed > 0).
 
        We must *never* mess with static pointers in an already loaded
        eln.  */
@@ -5127,7 +5155,7 @@ static bool
 file_in_eln_sys_dir (Lisp_Object filename)
 {
   Lisp_Object eln_sys_dir = Qnil;
-  Lisp_Object tmp = Vcomp_eln_load_path;
+  Lisp_Object tmp = Vnative_comp_eln_load_path;
   FOR_EACH_TAIL (tmp)
     eln_sys_dir = XCAR (tmp);
   return !NILP (Fstring_match (Fregexp_quote (Fexpand_file_name (eln_sys_dir,
@@ -5200,16 +5228,17 @@ syms_of_comp (void)
 {
 #ifdef HAVE_NATIVE_COMP
   /* Compiler control customizes.  */
-  DEFVAR_BOOL ("comp-deferred-compilation", comp_deferred_compilation,
+  DEFVAR_BOOL ("native-comp-deferred-compilation",
+              native_comp_deferred_compilation,
               doc: /* If non-nil compile loaded .elc files asynchronously.
 
 After compilation, each function definition is updated to the native
 compiled one.  */);
-  comp_deferred_compilation = true;
+  native_comp_deferred_compilation = true;
 
-  DEFSYM (Qcomp_speed, "comp-speed");
-  DEFSYM (Qcomp_debug, "comp-debug");
-  DEFSYM (Qcomp_native_driver_options, "comp-native-driver-options");
+  DEFSYM (Qnative_comp_speed, "native-comp-speed");
+  DEFSYM (Qnative_comp_debug, "native-comp-debug");
+  DEFSYM (Qnative_comp_driver_options, "native-comp-driver-options");
   DEFSYM (Qcomp_libgccjit_reproducer, "comp-libgccjit-reproducer");
 
   /* Limple instruction set.  */
@@ -5272,7 +5301,8 @@ compiled one.  */);
   DEFSYM (Qlambda_fixup, "lambda-fixup");
   DEFSYM (Qgccjit, "gccjit");
   DEFSYM (Qcomp_subr_trampoline_install, "comp-subr-trampoline-install");
-  DEFSYM (Qcomp_warning_on_missing_source, "comp-warning-on-missing-source");
+  DEFSYM (Qnative_comp_warning_on_missing_source,
+         "native-comp-warning-on-missing-source");
 
   /* To be signaled by the compiler.  */
   DEFSYM (Qnative_compiler_error, "native-compiler-error");
@@ -5368,7 +5398,7 @@ For internal use.  */);
               doc: /* Hash table eln-filename -> el-filename.  */);
   Vcomp_eln_to_el_h = CALLN (Fmake_hash_table, QCtest, Qequal);
 
-  DEFVAR_LISP ("comp-eln-load-path", Vcomp_eln_load_path,
+  DEFVAR_LISP ("native-comp-eln-load-path", Vnative_comp_eln_load_path,
               doc: /* List of eln cache directories.
 
 If a directory is non absolute is assumed to be relative to
@@ -5380,7 +5410,7 @@ The last directory of this list is assumed to be the 
system one.  */);
   /* Temporary value in use for bootstrap.  We can't do better as
      `invocation-directory' is still unset, will be fixed up during
      dump reload.  */
-  Vcomp_eln_load_path = Fcons (build_string ("../native-lisp/"), Qnil);
+  Vnative_comp_eln_load_path = Fcons (build_string ("../native-lisp/"), Qnil);
 
   DEFVAR_BOOL ("comp-enable-subr-trampolines", comp_enable_subr_trampolines,
               doc: /* If non-nil enable primitive trampoline synthesis.
@@ -5403,7 +5433,7 @@ For internal use.  */);
               doc: /* When non-nil assume the file being compiled to
 be preloaded.  */);
 
-  Fprovide (intern_c_string ("nativecomp"), Qnil);
+  Fprovide (intern_c_string ("native-compile"), Qnil);
 #endif /* #ifdef HAVE_NATIVE_COMP */
 
   defsubr (&Snative_comp_available_p);
diff --git a/src/composite.c b/src/composite.c
index f1c0112..129e9d6 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -953,8 +953,12 @@ char_composable_p (int c)
   Lisp_Object val;
   return (c >= ' '
          && (c == ZERO_WIDTH_NON_JOINER || c == ZERO_WIDTH_JOINER
-             || (val = CHAR_TABLE_REF (Vunicode_category_table, c),
-                 (FIXNUMP (val) && (XFIXNUM (val) <= UNICODE_CATEGORY_Zs)))));
+             /* unicode-category-table may not be available during
+                dumping.  */
+             || (CHAR_TABLE_P (Vunicode_category_table)
+                 && (val = CHAR_TABLE_REF (Vunicode_category_table, c),
+                     (FIXNUMP (val)
+                      && (XFIXNUM (val) <= UNICODE_CATEGORY_Zs))))));
 }
 
 /* Update cmp_it->stop_pos to the next position after CHARPOS (and
@@ -1469,14 +1473,60 @@ struct position_record
     (POSITION).pos--;                          \
   } while (0)
 
-/* This is like find_composition, but find an automatic composition
-   instead.  It is assured that POS is not within a static
-   composition.  If found, set *GSTRING to the glyph-string
-   representing the composition, and return true.  Otherwise, *GSTRING to
-   Qnil, and return false.  */
+/* Similar to find_composition, but find an automatic composition instead.
+
+   This function looks for automatic composition at or near position
+   POS of OBJECT (a buffer or a string).  OBJECT defaults to the
+   current buffer.  It must be assured that POS is not within a static
+   composition.  Also, the current buffer must be displayed in some
+   window, otherwise the function will return FALSE.
+
+   If LIMIT is negative, and there's no composition that includes POS
+   (i.e. starts at or before POS and ends at or after POS), return
+   FALSE.  In this case, the function is allowed to look from POS as
+   far back as BACKLIM, and as far forward as POS+1 plus
+   MAX_AUTO_COMPOSITION_LOOKBACK, the maximum number of look-back for
+   automatic compositions (3) -- this is a limitation imposed by
+   composition rules in composition-function-table, which see.  If
+   BACKLIM is negative, it stands for the beginning of OBJECT: BEGV
+   for a buffer or position zero for a string.
+
+   If LIMIT is positive, search for a composition forward (LIMIT >
+   POS) or backward (LIMIT < POS).  In this case, LIMIT bounds the
+   search for the first character of a composed sequence.
+   (LIMIT == POS is the same as LIMIT < 0.)  If LIMIT > POS, the
+   function can find a composition that starts after POS.
+
+   BACKLIM limits how far back is the function allowed to look in
+   OBJECT while trying to find a position where it is safe to start
+   searching forward for compositions.  Such a safe place is generally
+   the position after a character that can never be composed.
+
+   If BACKLIM is negative, that means the first character position of
+   OBJECT; this is useful when calling the function for the first time
+   for a given buffer or string, since it is possible that a
+   composition begins before POS.  However, if POS is very far from
+   the beginning of OBJECT, a negative value of BACKLIM could make the
+   function slow.  Also, in this case the function may return START
+   and END that do not include POS, something that is not necessarily
+   wanted, and needs to be explicitly checked by the caller.
+
+   When calling the function in a loop for the same buffer/string, the
+   caller should generally set BACKLIM equal to POS, to avoid costly
+   repeated searches backward.  This is because if the previous
+   positions were already checked for compositions, there should be no
+   reason to re-check them.
+
+   If BACKLIM is positive, it must be less or equal to LIMIT.
+
+   If an automatic composition satisfying the above conditions is
+   found, set *GSTRING to the Lispy glyph-string representing the
+   composition, set *START and *END to the start and end of the
+   composed sequence, and return TRUE.  Otherwise, set *GSTRING to
+   nil, and return FALSE.  */
 
-static bool
-find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit,
+bool
+find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit, ptrdiff_t backlim,
                            ptrdiff_t *start, ptrdiff_t *end,
                            Lisp_Object *gstring, Lisp_Object string)
 {
@@ -1498,13 +1548,13 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t 
limit,
   cur.pos = pos;
   if (NILP (string))
     {
-      head = BEGV, tail = ZV, stop = GPT;
+      head = backlim < 0 ? BEGV : backlim, tail = ZV, stop = GPT;
       cur.pos_byte = CHAR_TO_BYTE (cur.pos);
       cur.p = BYTE_POS_ADDR (cur.pos_byte);
     }
   else
     {
-      head = 0, tail = SCHARS (string), stop = -1;
+      head = backlim < 0 ? 0 : backlim, tail = SCHARS (string), stop = -1;
       cur.pos_byte = string_char_to_byte (string, cur.pos);
       cur.p = SDATA (string) + cur.pos_byte;
     }
@@ -1512,6 +1562,9 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t 
limit,
     /* Finding a composition covering the character after POS is the
        same as setting LIMIT to POS.  */
     limit = pos;
+
+  eassert (backlim < 0 || backlim <= limit);
+
   if (limit <= pos)
     fore_check_limit = min (tail, pos + 1 + MAX_AUTO_COMPOSITION_LOOKBACK);
   else
@@ -1692,8 +1745,8 @@ composition_adjust_point (ptrdiff_t last_pt, ptrdiff_t 
new_pt)
     return new_pt;
 
   /* Next check the automatic composition.  */
-  if (! find_automatic_composition (new_pt, (ptrdiff_t) -1, &beg, &end, &val,
-                                   Qnil)
+  if (! find_automatic_composition (new_pt, (ptrdiff_t) -1, (ptrdiff_t) -1,
+                                   &beg, &end, &val, Qnil)
       || beg == new_pt)
     return new_pt;
   for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++)
@@ -1889,8 +1942,8 @@ See `find-composition' for more details.  */)
     {
       if (!NILP (BVAR (current_buffer, enable_multibyte_characters))
          && ! NILP (Vauto_composition_mode)
-         && find_automatic_composition (from, to, &start, &end, &gstring,
-                                        string))
+         && find_automatic_composition (from, to, (ptrdiff_t) -1,
+                                        &start, &end, &gstring, string))
        return list3 (make_fixnum (start), make_fixnum (end), gstring);
       return Qnil;
     }
@@ -1898,7 +1951,8 @@ See `find-composition' for more details.  */)
     {
       ptrdiff_t s, e;
 
-      if (find_automatic_composition (from, to, &s, &e, &gstring, string)
+      if (find_automatic_composition (from, to, (ptrdiff_t) -1,
+                                     &s, &e, &gstring, string)
          && (e <= fixed_pos ? e > end : s < start))
        return list3 (make_fixnum (s), make_fixnum (e), gstring);
     }
diff --git a/src/composite.h b/src/composite.h
index c5d3c0f..67e8720 100644
--- a/src/composite.h
+++ b/src/composite.h
@@ -246,6 +246,11 @@ composition_valid_p (ptrdiff_t start, ptrdiff_t end, 
Lisp_Object prop)
 /* Macros for lispy glyph-string.  This is completely different from
    struct glyph_string.  */
 
+/* LGSTRING is a string of font glyphs, LGLYPHs.  It is represented as
+   a Lisp vector, with components shown below.  Once LGSTRING was
+   processed by a shaping engine, it holds font glyphs for one or more
+   grapheme clusters.  */
+
 #define LGSTRING_HEADER(lgs) AREF (lgs, 0)
 #define LGSTRING_SET_HEADER(lgs, header) ASET (lgs, 0, header)
 
@@ -259,6 +264,10 @@ composition_valid_p (ptrdiff_t start, ptrdiff_t end, 
Lisp_Object prop)
 #define LGSTRING_ID(lgs) AREF (lgs, 1)
 #define LGSTRING_SET_ID(lgs, id) ASET (lgs, 1, id)
 
+/* LGSTRING_GLYPH_LEN is the maximum number of LGLYPHs that the
+   LGSTRING can hold.  This is NOT the actual number of valid LGLYPHs;
+   to find the latter, walk the glyphs returned by LGSTRING_GLYPH
+   until the first one that is nil.  */
 #define LGSTRING_GLYPH_LEN(lgs) (ASIZE ((lgs)) - 2)
 #define LGSTRING_GLYPH(lgs, idx) AREF ((lgs), (idx) + 2)
 #define LGSTRING_SET_GLYPH(lgs, idx, val) ASET ((lgs), (idx) + 2, (val))
@@ -278,6 +287,14 @@ enum lglyph_indices
     LGLYPH_SIZE
   };
 
+/* Each LGLYPH is a single font glyph, whose font code is in
+   LGLYPH_CODE.
+   LGLYPH_FROM and LGLYPH_TO are indices into LGSTRING; all the
+   LGLYPHs that share the same values of LGLYPH_FROM and LGLYPH_TO
+   belong to the same grapheme cluster.
+   LGLYPH_CHAR is one of the characters, usually the first one, that
+   contributed to the glyph (since there isn't a 1:1 correspondence
+   between composed characters and the font glyphs).  */
 #define LGLYPH_NEW() make_nil_vector (LGLYPH_SIZE)
 #define LGLYPH_FROM(g) XFIXNUM (AREF ((g), LGLYPH_IX_FROM))
 #define LGLYPH_TO(g) XFIXNUM (AREF ((g), LGLYPH_IX_TO))
@@ -320,6 +337,10 @@ extern bool composition_gstring_p (Lisp_Object);
 extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
                                       struct font_metrics *);
 
+extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                                       ptrdiff_t *, ptrdiff_t *,
+                                       Lisp_Object *, Lisp_Object);
+
 extern void composition_compute_stop_pos (struct composition_it *,
                                           ptrdiff_t, ptrdiff_t, ptrdiff_t,
                                           Lisp_Object);
diff --git a/src/conf_post.h b/src/conf_post.h
index 176ab28..8558dc4 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -99,10 +99,28 @@ typedef bool bool_bf;
 # define ADDRESS_SANITIZER false
 #endif
 
+#ifdef emacs
+/* We include stdlib.h here, because Gnulib's stdlib.h might redirect
+   'free' to its replacement, and we want to avoid that in unexec
+   builds.  Inclduing it here will render its inclusion after config.h
+   a no-op.  */
+# if (defined DARWIN_OS && defined HAVE_UNEXEC) || defined HYBRID_MALLOC
+#  include <stdlib.h>
+# endif
+#endif
+
 #if defined DARWIN_OS && defined emacs && defined HAVE_UNEXEC
+# undef malloc
 # define malloc unexec_malloc
+# undef realloc
 # define realloc unexec_realloc
+# undef free
 # define free unexec_free
+
+extern void *unexec_malloc (size_t);
+extern void *unexec_realloc (void *, size_t);
+extern void unexec_free (void *);
+
 #endif
 
 /* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use
@@ -111,12 +129,23 @@ typedef bool bool_bf;
    accomplish this.  */
 #ifdef HYBRID_MALLOC
 #ifdef emacs
+#undef malloc
 #define malloc hybrid_malloc
+#undef realloc
 #define realloc hybrid_realloc
+#undef aligned_alloc
 #define aligned_alloc hybrid_aligned_alloc
+#undef calloc
 #define calloc hybrid_calloc
+#undef free
 #define free hybrid_free
-#endif
+
+extern void *hybrid_malloc (size_t);
+extern void *hybrid_calloc (size_t, size_t);
+extern void hybrid_free (void *);
+extern void *hybrid_aligned_alloc (size_t, size_t);
+extern void *hybrid_realloc (void *, size_t);
+#endif /* emacs */
 #endif /* HYBRID_MALLOC */
 
 /* We have to go this route, rather than the old hpux9 approach of
diff --git a/src/data.c b/src/data.c
index d547f5d..059f31e 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2200,7 +2200,9 @@ From now on the default value will apply in this buffer.  
Return VARIABLE.  */)
 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
        1, 2, 0,
        doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
-BUFFER defaults to the current buffer.  */)
+BUFFER defaults to the current buffer.
+
+Also see `buffer-local-boundp'.*/)
   (Lisp_Object variable, Lisp_Object buffer)
 {
   struct buffer *buf = decode_buffer (buffer);
diff --git a/src/dispextern.h b/src/dispextern.h
index 213032d..33fcaa4 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -1262,8 +1262,6 @@ extern struct glyph space_glyph;
 /* True means last display completed.  False means it was preempted.  */
 
 extern bool display_completed;
-extern bool delayed_size_change;
-
 
 /************************************************************************
                          Glyph Strings
diff --git a/src/dispnew.c b/src/dispnew.c
index b3f7be6..1378c34 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -102,7 +102,7 @@ bool display_completed;
 
 /* True means SIGWINCH happened when not safe.  */
 
-bool delayed_size_change;
+static bool delayed_size_change;
 
 /* A glyph for a space.  */
 
@@ -5815,7 +5815,6 @@ deliver_window_change_signal (int sig)
 void
 do_pending_window_change (bool safe)
 {
-  /* If window change signal handler should have run before, run it now.  */
   if (redisplaying_p && !safe)
     return;
 
@@ -5830,8 +5829,11 @@ do_pending_window_change (bool safe)
          struct frame *f = XFRAME (frame);
 
          /* Negative new_width or new_height values mean no change is
-            required (a native size can never drop below zero).  */
-         if (f->new_height >= 0 || f->new_width >= 0)
+            required (a native size can never drop below zero).  If
+            new_size_p is not set, this means the size change was
+            requested by adjust_frame_size but has not been honored by
+            the window manager yet.  */
+         if (f->new_size_p && (f->new_height >= 0 || f->new_width >= 0))
            change_frame_size (f, f->new_width, f->new_height,
                               false, false, safe);
        }
@@ -5858,14 +5860,17 @@ change_frame_size_1 (struct frame *f, int new_width, 
int new_height,
       /* We can't deal with the change now, queue it for later.  */
       f->new_width = new_width;
       f->new_height = new_height;
+      f->new_size_p = true;
       delayed_size_change = true;
     }
   else
     {
       /* Storing -1 in the new_width/new_height slots means that no size
-        change is pending.  Native sizes are always non-negative.  */
+        change is pending.  Native sizes are always non-negative.
+        Reset the new_size_p slot as well.  */
       f->new_height = -1;
       f->new_width = -1;
+      f->new_size_p = false;
       /* adjust_frame_size wants its arguments in terms of text_width
         and text_height, so convert them here.  For pathologically
         small frames, the resulting values may be negative though.  */
diff --git a/src/doc.c b/src/doc.c
index 01f4368..6be023b 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -550,7 +550,7 @@ the same file name is found in the `doc-directory'.  */)
   Lisp_Object delayed_init =
     find_symbol_value (intern ("custom-delayed-init-variables"));
 
-  if (EQ (delayed_init, Qunbound)) delayed_init = Qnil;
+  if (!CONSP (delayed_init)) delayed_init = Qnil;
 
   CHECK_STRING (filename);
 
@@ -719,17 +719,19 @@ syms_of_doc (void)
 
   DEFVAR_LISP ("text-quoting-style", Vtext_quoting_style,
                doc: /* Style to use for single quotes in help and messages.
-Its value should be a symbol.  It works by substituting certain single
-quotes for grave accent and apostrophe.  This is done in help output
-\(but not for display of Info manuals) and in functions like `message'
-and `format-message'.  It is not done in `format'.
-
-`curve' means quote with curved single quotes ‘like this’.
-`straight' means quote with straight apostrophes \\='like this\\='.
-`grave' means quote with grave accent and apostrophe \\=`like this\\=';
-i.e., do not alter quote marks.  The default value nil acts like
-`curve' if curved single quotes are displayable, and like `grave'
-otherwise.  */);
+
+The value of this variable determines substitution of grave accents
+and apostrophes in help output (but not for display of Info
+manuals) and in functions like `message' and `format-message', but not
+in `format'.
+
+The value should be one of these symbols:
+  `curve':    quote with curved single quotes ‘like this’.
+  `straight': quote with straight apostrophes \\='like this\\='.
+  `grave':    quote with grave accent and apostrophe \\=`like this\\=';
+             i.e., do not alter the original quote marks.
+  nil:        like `curve' if curved single quotes are displayable,
+             and like `grave' otherwise.  This is the default.  */);
   Vtext_quoting_style = Qnil;
 
   DEFVAR_BOOL ("internal--text-quoting-flag", text_quoting_flag,
diff --git a/src/doprnt.c b/src/doprnt.c
index b6b5978..fe484b8 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -563,7 +563,7 @@ esprintf (char *buf, char const *format, ...)
    BUFSIZE_MAX.  */
 ptrdiff_t
 exprintf (char **buf, ptrdiff_t *bufsize,
-         char const *nonheapbuf, ptrdiff_t bufsize_max,
+         char *nonheapbuf, ptrdiff_t bufsize_max,
          char const *format, ...)
 {
   ptrdiff_t nbytes;
@@ -579,7 +579,7 @@ exprintf (char **buf, ptrdiff_t *bufsize,
 /* Act like exprintf, except take a va_list.  */
 ptrdiff_t
 evxprintf (char **buf, ptrdiff_t *bufsize,
-          char const *nonheapbuf, ptrdiff_t bufsize_max,
+          char *nonheapbuf, ptrdiff_t bufsize_max,
           char const *format, va_list ap)
 {
   for (;;)
diff --git a/src/dynlib.c b/src/dynlib.c
index 1338e91..a8c8843 100644
--- a/src/dynlib.c
+++ b/src/dynlib.c
@@ -135,7 +135,7 @@ dynlib_addr (void (*funcptr) (void), const char **fname, 
const char **symname)
   void *addr = (void *) funcptr;
 
   /* Step 1: Find the handle of the module where ADDR lives.  */
-  if (os_subtype == OS_9X
+  if (os_subtype == OS_SUBTYPE_9X
       /* Windows NT family version before XP (v5.1).  */
       || ((w32_major_version + (w32_minor_version > 0)) < 6))
     {
diff --git a/src/editfns.c b/src/editfns.c
index 04b8e85..aa0f46f 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -1452,8 +1452,8 @@ DEFUN ("insert-char", Finsert_char, Sinsert_char, 1, 3,
               (prefix-numeric-value current-prefix-arg)\
               t))",
        doc: /* Insert COUNT copies of CHARACTER.
-Interactively, prompt for CHARACTER.  You can specify CHARACTER in one
-of these ways:
+Interactively, prompt for CHARACTER using `read-char-by-name'.
+You can specify CHARACTER in one of these ways:
 
  - As its Unicode character name, e.g. \"LATIN SMALL LETTER A\".
    Completion is available; if you type a substring of the name
@@ -3390,7 +3390,7 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool 
message)
                  ptrdiff_t nch, nby;
                  nchars_string = SCHARS (arg);
                  width = lisp_string_width (arg, 0, nchars_string, prec,
-                                            &nch, &nby);
+                                            &nch, &nby, false);
                  if (prec < 0)
                    nbytes = SBYTES (arg);
                  else
diff --git a/src/emacs.c b/src/emacs.c
index 9157cd84..b7982ec 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -835,7 +835,13 @@ load_pdump (int argc, char **argv)
     NULL
 #endif
     ;
-  const char *argv0_base = "emacs";
+  const char *argv0_base =
+#ifdef NS_SELF_CONTAINED
+    "Emacs"
+#else
+    "emacs"
+#endif
+    ;
 
   /* TODO: maybe more thoroughly scrub process environment in order to
      make this use case (loading a dump file in an unexeced emacs)
@@ -912,6 +918,8 @@ load_pdump (int argc, char **argv)
   /* On MS-Windows, PATH_EXEC normally starts with a literal
      "%emacs_dir%", so it will never work without some tweaking.  */
   path_exec = w32_relocate (path_exec);
+#elif defined (HAVE_NS)
+  path_exec = ns_relocate (path_exec);
 #endif
 
   /* Look for "emacs.pdmp" in PATH_EXEC.  We hardcode "emacs" in
@@ -929,6 +937,7 @@ load_pdump (int argc, char **argv)
     }
   sprintf (dump_file, "%s%c%s%s",
            path_exec, DIRECTORY_SEP, argv0_base, suffix);
+#if !defined (NS_SELF_CONTAINED)
   /* Assume the Emacs binary lives in a sibling directory as set up by
      the default installation configuration.  */
   const char *go_up = "../../../../bin/";
@@ -943,6 +952,7 @@ load_pdump (int argc, char **argv)
   sprintf (emacs_executable, "%s%c%s%s%s",
           path_exec, DIRECTORY_SEP, go_up, argv0_base,
           strip_suffix ? strip_suffix : "");
+#endif
   result = pdumper_load (dump_file, emacs_executable);
 
   if (result == PDUMPER_LOAD_FILE_NOT_FOUND)
@@ -2294,6 +2304,7 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
     Vdump_mode = build_string (dump_mode);
 
   /* Enter editor command loop.  This never returns.  */
+  set_initial_minibuffer_mode ();
   Frecursive_edit ();
   eassume (false);
 }
@@ -2959,7 +2970,11 @@ decode_env_path (const char *evarname, const char 
*defalt, bool empty)
     path = 0;
   if (!path)
     {
+#ifdef NS_SELF_CONTAINED
+      path = ns_relocate (defalt);
+#else
       path = defalt;
+#endif
 #ifdef WINDOWSNT
       defaulted = 1;
 #endif
diff --git a/src/eval.c b/src/eval.c
index aeedcc5..18faa0b 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1370,7 +1370,7 @@ internal_lisp_condition_case (Lisp_Object var, 
Lisp_Object bodyform,
                     || CONSP (XCAR (tem))))))
        error ("Invalid condition handler: %s",
               SDATA (Fprin1_to_string (tem, Qt)));
-      if (EQ (XCAR (tem), QCsuccess))
+      if (CONSP (tem) && EQ (XCAR (tem), QCsuccess))
        success_handler = XCDR (tem);
       else
        clausenb++;
@@ -1387,8 +1387,11 @@ internal_lisp_condition_case (Lisp_Object var, 
Lisp_Object bodyform,
   Lisp_Object volatile *clauses = alloca (clausenb * sizeof *clauses);
   clauses += clausenb;
   for (Lisp_Object tail = handlers; CONSP (tail); tail = XCDR (tail))
-    if (!EQ (XCAR (XCAR (tail)), QCsuccess))
-      *--clauses = XCAR (tail);
+    {
+      Lisp_Object tem = XCAR (tail);
+      if (!(CONSP (tem) && EQ (XCAR (tem), QCsuccess)))
+       *--clauses = tem;
+    }
   for (ptrdiff_t i = 0; i < clausenb; i++)
     {
       Lisp_Object clause = clauses[i];
diff --git a/src/fileio.c b/src/fileio.c
index 741e297..c0d1a50 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -1830,6 +1830,9 @@ the value of that variable.  The variable name should be 
terminated
 with a character not a letter, digit or underscore; otherwise, enclose
 the entire variable name in braces.
 
+If FOO is not defined in the environment, `$FOO' is left unchanged in
+the value of this function.
+
 If `/~' appears, all of FILENAME through that `/' is discarded.
 If `//' appears, everything up to and including the first of
 those `/' is discarded.  */)
@@ -2987,12 +2990,16 @@ file_directory_p (Lisp_Object file)
 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p,
        Sfile_accessible_directory_p, 1, 1, 0,
        doc: /* Return t if FILENAME names a directory you can open.
-For the value to be t, FILENAME must specify the name of a directory
-as a file, and the directory must allow you to open files in it.  In
-order to use a directory as a buffer's current directory, this
-predicate must return true.  A directory name spec may be given
-instead; then the value is t if the directory so specified exists and
-really is a readable and searchable directory.  */)
+This means that FILENAME must specify the name of a directory, and the
+directory must allow you to open files in it.  If this isn't the case,
+return nil.
+
+FILENAME can either be a directory name (eg. \"/tmp/foo/\") or the
+file name of a file which is a directory (eg. \"/tmp/foo\", without
+the final slash).
+
+In order to use a directory as a buffer's current directory, this
+predicate must return true.  */)
   (Lisp_Object filename)
 {
   Lisp_Object absname;
diff --git a/src/fns.c b/src/fns.c
index 41429c8..a178216 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -39,8 +39,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "puresize.h"
 #include "gnutls.h"
 
-static void sort_vector_copy (Lisp_Object, ptrdiff_t,
-                             Lisp_Object *restrict, Lisp_Object *restrict);
+static void sort_vector_copy (Lisp_Object pred, ptrdiff_t len,
+                             Lisp_Object src[restrict VLA_ELEMS (len)],
+                             Lisp_Object dest[restrict VLA_ELEMS (len)]);
 enum equal_kind { EQUAL_NO_QUIT, EQUAL_PLAIN, EQUAL_INCLUDING_PROPERTIES };
 static bool internal_equal (Lisp_Object, Lisp_Object,
                            enum equal_kind, int, Lisp_Object);
@@ -5892,12 +5893,14 @@ in OBJECT.  */)
 
 DEFUN ("line-number-at-pos", Fline_number_at_pos,
        Sline_number_at_pos, 0, 2, 0,
-       doc: /* Return the line number at POSITION.
-If POSITION is nil, use the current buffer location.
-
-If the buffer is narrowed, the position returned is the position in the
-visible part of the buffer.  If ABSOLUTE is non-nil, count the lines
-from the absolute start of the buffer.  */)
+       doc: /* Return the line number at POSITION in the current buffer.
+If POSITION is nil or omitted, it defaults to point's position in the
+current buffer.
+
+If the buffer is narrowed, the return value by default counts the lines
+from the beginning of the accessible portion of the buffer.  But if the
+second optional argument ABSOLUTE is non-nil, the value counts the lines
+from the absolute start of the buffer, disregarding the narrowing.  */)
   (register Lisp_Object position, Lisp_Object absolute)
 {
   ptrdiff_t pos, start = BEGV_BYTE;
@@ -5915,9 +5918,9 @@ from the absolute start of the buffer.  */)
   if (!NILP (absolute))
     start = BEG_BYTE;
 
-  /* Check that POSITION is n the visible range of the buffer. */
+  /* Check that POSITION is in the accessible range of the buffer. */
   if (pos < BEGV || pos > ZV)
-    args_out_of_range (make_int (start), make_int (ZV));
+    args_out_of_range_3 (make_int (pos), make_int (BEGV), make_int (ZV));
 
   return make_int (count_lines (start, CHAR_TO_BYTE (pos)) + 1);
 }
diff --git a/src/frame.c b/src/frame.c
index 4129a70..623e4ba 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -619,12 +619,8 @@ frame_size_history_extra (struct frame *f, Lisp_Object 
parameter,
  *   must be preserved.  The code for setting up window dividers and
  *   that responsible for wrapping the (internal) tool bar use this.
  *
- * 5 means to never call set_window_size_hook.  change_frame_size uses
- *   this.
- *
- * Note that even when set_window_size_hook is not called, individual
- * windows may have to be resized (via `window--sanitize-window-sizes')
- * in order to support minimum size constraints.
+ * 5 means to never call set_window_size_hook.  Usually this means to
+ *   call resize_frame_windows.  change_frame_size uses this.
  *
  * PRETEND is as for change_frame_size.  PARAMETER, if non-nil, is the
  * symbol of the parameter changed (like `menu-bar-lines', `font', ...).
@@ -716,6 +712,9 @@ adjust_frame_size (struct frame *f, int new_text_width, int 
new_text_height,
 
   if (FRAME_WINDOW_P (f)
       && f->can_set_window_size
+      /* For inhibit == 1 call the window_size_hook only if a native
+        size changes.  For inhibit == 0 or inhibit == 2 always call
+        it.  */
       && ((!inhibit_horizontal
           && (new_native_width != old_native_width
               || inhibit == 0 || inhibit == 2))
@@ -723,29 +722,25 @@ adjust_frame_size (struct frame *f, int new_text_width, 
int new_text_height,
              && (new_native_height != old_native_height
                  || inhibit == 0 || inhibit == 2))))
     {
-      /* Make sure we respect fullheight and fullwidth.  */
-      if (inhibit_horizontal)
-       new_native_width = old_native_width;
-      else if (inhibit_vertical)
-       new_native_height = old_native_height;
-
-      if (inhibit == 2 && f->new_width > 0 && f->new_height > 0)
+      if (inhibit == 2
+#ifdef USE_MOTIF
+         && !EQ (parameter, Qmenu_bar_lines)
+#endif
+         && (f->new_width >= 0 || f->new_height >= 0))
        /* For implied resizes with inhibit 2 (external menu and tool
           bar) pick up any new sizes the display engine has not
           processed yet.  Otherwsie, we would request the old sizes
           which will make this request appear as a request to set new
-          sizes and have the WM react accordingly which is not TRT.  */
+          sizes and have the WM react accordingly which is not TRT.
+
+          We don't that for the external menu bar on Motif.
+          Otherwise, switching off the menu bar will shrink the frame
+          and switching it on will not enlarge it.  */
        {
-         /* But don't that for the external menu bar on Motif.
-            Otherwise, switching off the menu bar will shrink the frame
-            and switching it on will not enlarge it.  */
-#ifdef USE_MOTIF
-         if (!EQ (parameter, Qmenu_bar_lines))
-#endif
-           {
-             new_native_width = f->new_width;
-             new_native_height = f->new_height;
-           }
+         if (f->new_width >= 0)
+           new_native_width = f->new_width;
+         if (f->new_height >= 0)
+           new_native_height = f->new_height;
        }
 
       if (CONSP (frame_size_history))
@@ -761,6 +756,17 @@ adjust_frame_size (struct frame *f, int new_text_width, 
int new_text_height,
                                   min_inner_width, min_inner_height,
                                   inhibit_horizontal, inhibit_vertical);
 
+      if (inhibit == 0 || inhibit == 1)
+       {
+         f->new_width = new_native_width;
+         f->new_height = new_native_height;
+         /* Resetting f->new_size_p is controversial: It might cause
+            do_pending_window_change drop a previous request and we are
+            in troubles when the window manager does not honor the
+            request we issue here.  */
+         f->new_size_p = false;
+       }
+
       if (FRAME_TERMINAL (f)->set_window_size_hook)
         FRAME_TERMINAL (f)->set_window_size_hook
          (f, 0, new_native_width, new_native_height);
@@ -965,6 +971,7 @@ make_frame (bool mini_p)
   f->no_accept_focus = false;
   f->z_group = z_group_none;
   f->tooltip = false;
+  f->was_invisible = false;
   f->child_frame_border_width = -1;
   f->last_tab_bar_item = -1;
 #ifndef HAVE_EXT_TOOL_BAR
@@ -975,6 +982,7 @@ make_frame (bool mini_p)
   f->ns_transparent_titlebar = false;
 #endif
 #endif
+  f->select_mini_window_flag = false;
   /* This one should never be zero.  */
   f->change_stamp = 1;
   root_window = make_window ();
@@ -1535,7 +1543,17 @@ do_switch_frame (Lisp_Object frame, int track, int 
for_deletion, Lisp_Object nor
       tty->top_frame = frame;
     }
 
+  sf->select_mini_window_flag = MINI_WINDOW_P (XWINDOW (sf->selected_window));
+
   selected_frame = frame;
+
+  move_minibuffers_onto_frame (sf, for_deletion);
+
+  if (f->select_mini_window_flag
+      && !NILP (Fminibufferp (XWINDOW (f->minibuffer_window)->contents, Qt)))
+    f->selected_window = f->minibuffer_window;
+  f->select_mini_window_flag = false;
+
   if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame)))
     last_nonminibuf_frame = XFRAME (selected_frame);
 
@@ -1552,7 +1570,6 @@ do_switch_frame (Lisp_Object frame, int track, int 
for_deletion, Lisp_Object nor
 #endif
     internal_last_event_frame = Qnil;
 
-  move_minibuffers_onto_frame (sf, for_deletion);
   return frame;
 }
 
@@ -1923,52 +1940,6 @@ other_frames (struct frame *f, bool invisible, bool 
force)
   return false;
 }
 
-/* Make sure that minibuf_window doesn't refer to FRAME's minibuffer
-   window.  Preferably use the selected frame's minibuffer window
-   instead.  If the selected frame doesn't have one, get some other
-   frame's minibuffer window.  SELECT non-zero means select the new
-   minibuffer window.  */
-static void
-check_minibuf_window (Lisp_Object frame, int select)
-{
-  struct frame *f = decode_live_frame (frame);
-
-  XSETFRAME (frame, f);
-
-  if (WINDOWP (minibuf_window) && EQ (f->minibuffer_window, minibuf_window))
-    {
-      Lisp_Object frames, this, window = make_fixnum (0);
-
-      if (!EQ (frame, selected_frame)
-         && FRAME_HAS_MINIBUF_P (XFRAME (selected_frame)))
-       window = FRAME_MINIBUF_WINDOW (XFRAME (selected_frame));
-      else
-       FOR_EACH_FRAME (frames, this)
-         {
-           if (!EQ (this, frame) && FRAME_HAS_MINIBUF_P (XFRAME (this)))
-             {
-               window = FRAME_MINIBUF_WINDOW (XFRAME (this));
-               break;
-             }
-         }
-
-      /* Don't abort if no window was found (Bug#15247).  */
-      if (WINDOWP (window))
-       {
-         /* Use set_window_buffer instead of Fset_window_buffer (see
-            discussion of bug#11984, bug#12025, bug#12026).  */
-         set_window_buffer (window, XWINDOW (minibuf_window)->contents, 0, 0);
-         minibuf_window = window;
-
-         /* SELECT non-zero usually means that FRAME's minibuffer
-            window was selected; select the new one.  */
-         if (select)
-           Fselect_window (minibuf_window, Qnil);
-       }
-    }
-}
-
-
 /**
  * delete_frame:
  *
@@ -1983,7 +1954,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
   struct frame *sf;
   struct kboard *kb;
   Lisp_Object frames, frame1;
-  int minibuffer_selected, is_tooltip_frame;
+  int is_tooltip_frame;
   bool nochild = !FRAME_PARENT_FRAME (f);
   Lisp_Object minibuffer_child_frame = Qnil;
 
@@ -2091,7 +2062,6 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
 
   /* At this point, we are committed to deleting the frame.
      There is no more chance for errors to prevent it.  */
-  minibuffer_selected = EQ (minibuf_window, selected_window);
   sf = SELECTED_FRAME ();
   /* Don't let the frame remain selected.  */
   if (f == sf)
@@ -2149,9 +2119,10 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
       do_switch_frame (frame1, 0, 1, Qnil);
       sf = SELECTED_FRAME ();
     }
-
-  /* Don't allow minibuf_window to remain on a deleted frame.  */
-  check_minibuf_window (frame, minibuffer_selected);
+  else
+    /* Ensure any minibuffers on FRAME are moved onto the selected
+       frame.  */
+    move_minibuffers_onto_frame (f, true);
 
   /* Don't let echo_area_window to remain on a deleted frame.  */
   if (EQ (f->minibuffer_window, echo_area_window))
@@ -2782,9 +2753,6 @@ displayed in the terminal.  */)
   if (NILP (force) && !other_frames (f, true, false))
     error ("Attempt to make invisible the sole visible or iconified frame");
 
-  /* Don't allow minibuf_window to remain on an invisible frame.  */
-  check_minibuf_window (frame, EQ (minibuf_window, selected_window));
-
   if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->frame_visible_invisible_hook)
     FRAME_TERMINAL (f)->frame_visible_invisible_hook (f, false);
 
@@ -2827,9 +2795,6 @@ for how to proceed.  */)
     }
 #endif /* HAVE_WINDOW_SYSTEM */
 
-  /* Don't allow minibuf_window to remain on an iconified frame.  */
-  check_minibuf_window (frame, EQ (minibuf_window, selected_window));
-
   if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->iconify_frame_hook)
     FRAME_TERMINAL (f)->iconify_frame_hook (f);
 
@@ -3289,12 +3254,15 @@ If FRAME is omitted or nil, return information on the 
currently selected frame.
   /* It's questionable whether here we should report the value of
      f->new_height (and f->new_width below) but we've done that in the
      past, so let's keep it.  Note that a value of -1 for either of
-     these means that no new size was requested.  */
-  height = (f->new_height >= 0
+     these means that no new size was requested.
+
+     But check f->new_size before to make sure that f->new_height and
+     f->new_width are not ones requested by adjust_frame_size.  */
+  height = ((f->new_size_p && f->new_height >= 0)
            ? f->new_height / FRAME_LINE_HEIGHT (f)
            : FRAME_LINES (f));
   store_in_alist (&alist, Qheight, make_fixnum (height));
-  width = (f->new_width >= 0
+  width = ((f->new_size_p && f->new_width >= 0)
           ? f->new_width / FRAME_COLUMN_WIDTH (f)
           : FRAME_COLS(f));
   store_in_alist (&alist, Qwidth, make_fixnum (width));
@@ -5898,7 +5866,18 @@ selected frame.  This is useful when 
`make-pointer-invisible' is set.  */)
   return decode_any_frame (frame)->pointer_invisible ? Qnil : Qt;
 }
 
+DEFUN ("frame--set-was-invisible", Fframe__set_was_invisible,
+       Sframe__set_was_invisible, 2, 2, 0,
+       doc: /* Set FRAME's was-invisible flag if WAS-INVISIBLE is non-nil.
+This function is for internal use only.  */)
+  (Lisp_Object frame, Lisp_Object was_invisible)
+{
+  struct frame *f = decode_live_frame (frame);
 
+  f->was_invisible = !NILP (was_invisible);
+
+  return f->was_invisible ? Qt : Qnil;
+}
 
 /***********************************************************************
                        Multimonitor data
@@ -6538,6 +6517,7 @@ iconify the top level frame instead.  */);
   defsubr (&Sframe_position);
   defsubr (&Sset_frame_position);
   defsubr (&Sframe_pointer_visible_p);
+  defsubr (&Sframe__set_was_invisible);
   defsubr (&Sframe_window_state_change);
   defsubr (&Sset_frame_window_state_change);
   defsubr (&Sframe_scale_factor);
diff --git a/src/frame.h b/src/frame.h
index 19ee6ac..cad3df5 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -453,6 +453,20 @@ struct frame
      frame is in the process of being redisplayed.  */
   bool_bf inhibit_clear_image_cache : 1;
 
+  /* True when new_width or new_height were set by change_frame_size,
+     false when they were set by adjust_frame_size internally or not
+     set.  */
+  bool_bf new_size_p : 1;
+
+  /* True when frame was invisible before first MapNotify event.  Used
+     in X builds only.  */
+  bool_bf was_invisible : 1;
+
+  /* True when the frame isn't selected, and selecting it in the
+     future should select the mini-window rather than the currently
+     selected window in the frame, assuming there is still an active
+     minibuffer in that mini-window.  */
+  bool_bf select_mini_window_flag : 1;
   /* Bitfield area ends here.  */
 
   /* This frame's change stamp, set the last time window change
diff --git a/src/fringe.c b/src/fringe.c
index 65c9a84..47615f5 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -1776,14 +1776,15 @@ gui_init_fringe (struct redisplay_interface *rif)
   for (bt = NO_FRINGE_BITMAP + 1; bt < MAX_STANDARD_FRINGE_BITMAPS; bt++)
     {
       struct fringe_bitmap *fb = &standard_bitmaps[bt];
-      rif->define_fringe_bitmap (bt, fb->bits, fb->height, fb->width);
+      if (!fringe_bitmaps[bt])
+        rif->define_fringe_bitmap (bt, fb->bits, fb->height, fb->width);
     }
 
   /* Set up user-defined fringe bitmaps that might have been defined
      before the frame of this kind was initialized.  This can happen
      if Emacs is started as a daemon and the init files define fringe
      bitmaps.  */
-  for ( ; bt < max_used_fringe_bitmap; bt++)
+  for (bt = NO_FRINGE_BITMAP + 1; bt < max_used_fringe_bitmap; bt++)
     {
       struct fringe_bitmap *fb = fringe_bitmaps[bt];
       if (fb)
diff --git a/src/gmalloc.c b/src/gmalloc.c
index 66008ea..55ae736 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -1690,16 +1690,6 @@ valloc (size_t size)
 #undef free
 
 #ifdef HYBRID_MALLOC
-/* Declare system malloc and friends.  */
-extern void *malloc (size_t size);
-extern void *realloc (void *ptr, size_t size);
-extern void *calloc (size_t nmemb, size_t size);
-extern void free (void *ptr);
-#ifdef HAVE_ALIGNED_ALLOC
-extern void *aligned_alloc (size_t alignment, size_t size);
-#elif defined HAVE_POSIX_MEMALIGN
-extern int posix_memalign (void **memptr, size_t alignment, size_t size);
-#endif
 
 /* Assuming PTR was allocated via the hybrid malloc, return true if
    PTR was allocated via gmalloc, not the system malloc.  Also, return
@@ -1736,8 +1726,8 @@ hybrid_calloc (size_t nmemb, size_t size)
   return gcalloc (nmemb, size);
 }
 
-void
-hybrid_free (void *ptr)
+static void
+hybrid_free_1 (void *ptr)
 {
   if (allocated_via_gmalloc (ptr))
     gfree (ptr);
@@ -1745,6 +1735,24 @@ hybrid_free (void *ptr)
     free (ptr);
 }
 
+void
+hybrid_free (void *ptr)
+{
+  /* Stolen from Gnulib, to make sure we preserve errno.  */
+#if defined __GNUC__ && !defined __clang__
+  int err[2];
+  err[0] = errno;
+  err[1] = errno;
+  errno = 0;
+  hybrid_free_1 (ptr);
+  errno = err[errno == 0];
+#else
+  int err = errno;
+  hybrid_free_1 (ptr);
+  errno = err;
+#endif
+}
+
 #if defined HAVE_ALIGNED_ALLOC || defined HAVE_POSIX_MEMALIGN
 void *
 hybrid_aligned_alloc (size_t alignment, size_t size)
diff --git a/src/gnutls.c b/src/gnutls.c
index 4d5a909..22e7f2c 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -625,16 +625,11 @@ gnutls_try_handshake (struct Lisp_Process *proc)
 
   while ((ret = gnutls_handshake (state)) < 0)
     {
-      if (gnutls_error_is_fatal (ret))
-       return emacs_gnutls_handle_error (state, ret);
-      do
-       ret = gnutls_handshake (state);
-      while (ret == GNUTLS_E_INTERRUPTED);
-
-      if (0 <= ret || emacs_gnutls_handle_error (state, ret) == 0
-         || non_blocking)
+      if (emacs_gnutls_handle_error (state, ret) == 0) /* fatal */
        break;
       maybe_quit ();
+      if (non_blocking && ret != GNUTLS_E_INTERRUPTED)
+       break;
     }
 
   proc->gnutls_initstage = GNUTLS_STAGE_HANDSHAKE_TRIED;
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 4ad172b..dee2a93 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -81,8 +81,6 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
   gtk_font_selection_dialog_set_font_name (x, y)
 #endif
 
-#define gdk_window_get_geometry(w, a, b, c, d) \
-  gdk_window_get_geometry (w, a, b, c, d, 0)
 #define gtk_box_new(ori, spacing)                                       \
   ((ori) == GTK_ORIENTATION_HORIZONTAL                                  \
    ? gtk_hbox_new (FALSE, (spacing)) : gtk_vbox_new (FALSE, (spacing)))
@@ -916,16 +914,18 @@ void
 xg_frame_resized (struct frame *f, int width, int height)
 {
   /* Ignore case where size of native rectangle didn't change.  */
-  if (width != FRAME_PIXEL_WIDTH (f) || height != FRAME_PIXEL_HEIGHT (f)
-      || (delayed_size_change
-         && (width != f->new_width || height != f->new_height)))
+  if (width != FRAME_PIXEL_WIDTH (f)
+      || height != FRAME_PIXEL_HEIGHT (f)
+      || (f->new_size_p
+         && ((f->new_width >= 0 && width != f->new_width)
+             || (f->new_height >= 0 && height != f->new_height))))
     {
       if (CONSP (frame_size_history))
        frame_size_history_extra
          (f, build_string ("xg_frame_resized, changed"),
           FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
-          delayed_size_change ? f->new_width : -1,
-          delayed_size_change ? f->new_height : -1);
+          f->new_size_p ? f->new_width : -1,
+          f->new_size_p ? f->new_height : -1);
 
       FRAME_RIF (f)->clear_under_internal_border (f);
       change_frame_size (f, width, height, false, true, false);
@@ -936,8 +936,8 @@ xg_frame_resized (struct frame *f, int width, int height)
     frame_size_history_extra
       (f, build_string ("xg_frame_resized, unchanged"),
        FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
-       delayed_size_change ? f->new_width : -1,
-       delayed_size_change ? f->new_height : -1);
+       f->new_size_p ? f->new_width : -1,
+       f->new_size_p ? f->new_height : -1);
 
 }
 
@@ -1026,17 +1026,17 @@ xg_frame_set_char_size (struct frame *f, int width, int 
height)
      the frame is mapped again we will (hopefully) get the correct size.  */
   if (FRAME_VISIBLE_P (f) && !was_visible)
     {
-      /* Must call this to flush out events */
-      (void)gtk_events_pending ();
-      gdk_flush ();
-      x_wait_for_event (f, ConfigureNotify);
-
       if (CONSP (frame_size_history))
        frame_size_history_extra
          (f, build_string ("xg_frame_set_char_size, visible"),
           FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
           f->new_width, f->new_height);
 
+      /* Must call this to flush out events */
+      (void)gtk_events_pending ();
+      gdk_flush ();
+      x_wait_for_event (f, ConfigureNotify);
+
       if (!NILP (fullscreen))
        /* Try to restore fullscreen state.  */
        {
diff --git a/src/image.c b/src/image.c
index f2fb69a..07de4d3 100644
--- a/src/image.c
+++ b/src/image.c
@@ -3153,19 +3153,16 @@ image_find_image_fd (Lisp_Object file, int *pfd)
   /* Try to find FILE in data-directory/images, then x-bitmap-file-path.  */
   fd = openp (search_path, file, Qnil, &file_found,
              pfd ? Qt : make_fixnum (R_OK), false, false);
-  if (fd >= 0 || fd == -2)
+  if (fd == -2)
     {
-      file_found = ENCODE_FILE (file_found);
-      if (fd == -2)
-       {
-         /* The file exists locally, but has a file name handler.
-            (This happens, e.g., under Auto Image File Mode.)
-            'openp' didn't open the file, so we should, because the
-            caller expects that.  */
-         fd = emacs_open (SSDATA (file_found), O_RDONLY, 0);
-       }
+      /* The file exists locally, but has a file name handler.
+        (This happens, e.g., under Auto Image File Mode.)
+        'openp' didn't open the file, so we should, because the
+        caller expects that.  */
+      Lisp_Object encoded_name = ENCODE_FILE (file_found);
+      fd = emacs_open (SSDATA (encoded_name), O_RDONLY, 0);
     }
-  else /* fd < 0, but not -2 */
+  else if (fd < 0)
     return Qnil;
   if (pfd)
     *pfd = fd;
@@ -3173,8 +3170,8 @@ image_find_image_fd (Lisp_Object file, int *pfd)
 }
 
 /* Find image file FILE.  Look in data-directory/images, then
-   x-bitmap-file-path.  Value is the encoded full name of the file
-   found, or nil if not found.  */
+   x-bitmap-file-path.  Value is the full name of the file found, or
+   nil if not found.  */
 
 Lisp_Object
 image_find_image_file (Lisp_Object file)
@@ -4061,6 +4058,7 @@ enum xpm_keyword_index
   XPM_LAST
 };
 
+#if defined HAVE_XPM || defined HAVE_NS
 /* Vector of image_keyword structures describing the format
    of valid XPM image specifications.  */
 
@@ -4078,6 +4076,7 @@ static const struct image_keyword xpm_format[XPM_LAST] =
   {":color-symbols",   IMAGE_DONT_CHECK_VALUE_TYPE,            0},
   {":background",      IMAGE_STRING_OR_NIL_VALUE,              0}
 };
+#endif /* HAVE_XPM || HAVE_NS */
 
 #if defined HAVE_X_WINDOWS && !defined USE_CAIRO
 
@@ -4301,6 +4300,7 @@ init_xpm_functions (void)
 
 #endif /* WINDOWSNT */
 
+#if defined HAVE_XPM || defined HAVE_NS
 /* Value is true if COLOR_SYMBOLS is a valid color symbols list
    for XPM images.  Such a list must consist of conses whose car and
    cdr are strings.  */
@@ -4321,7 +4321,6 @@ xpm_valid_color_symbols_p (Lisp_Object color_symbols)
   return NILP (color_symbols);
 }
 
-
 /* Value is true if OBJECT is a valid XPM image specification.  */
 
 static bool
@@ -4337,6 +4336,7 @@ xpm_image_p (Lisp_Object object)
          && (! fmt[XPM_COLOR_SYMBOLS].count
              || xpm_valid_color_symbols_p (fmt[XPM_COLOR_SYMBOLS].value)));
 }
+#endif /* HAVE_XPM || HAVE_NS */
 
 #endif /* HAVE_XPM || USE_CAIRO || HAVE_NS */
 
@@ -4706,10 +4706,11 @@ xpm_load (struct frame *f, struct image *img)
 
 #endif /* HAVE_XPM && !USE_CAIRO */
 
-#if defined USE_CAIRO || (defined HAVE_NS && !defined HAVE_XPM)
+#if (defined USE_CAIRO && defined HAVE_XPM)    \
+  || (defined HAVE_NS && !defined HAVE_XPM)
 
-/* XPM support functions for NS where libxpm is not available.
-   Only XPM version 3 (without any extensions) is supported.  */
+/* XPM support functions for NS where libxpm is not available, and for
+   Cairo.  Only XPM version 3 (without any extensions) is supported.  */
 
 static void xpm_put_color_table_v (Lisp_Object, const char *,
                                    int, Lisp_Object);
diff --git a/src/indent.c b/src/indent.c
index 6246b54..de6b489 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -1967,9 +1967,13 @@ line_number_display_width (struct window *w, int *width, 
int *pixel_width)
       struct it it;
       struct text_pos startpos;
       bool saved_restriction = false;
+      struct buffer *old_buf = current_buffer;
       ptrdiff_t count = SPECPDL_INDEX ();
       SET_TEXT_POS_FROM_MARKER (startpos, w->start);
       void *itdata = bidi_shelve_cache ();
+
+      /* Make sure W's buffer is the current one.  */
+      set_buffer_internal_1 (XBUFFER (w->contents));
       /* We want to start from window's start point, but it could be
         outside the accessible region, in which case we widen the
         buffer temporarily.  It could even be beyond the buffer's end
@@ -1998,6 +2002,7 @@ line_number_display_width (struct window *w, int *width, 
int *pixel_width)
       *pixel_width = it.lnum_pixel_width;
       if (saved_restriction)
        unbind_to (count, Qnil);
+      set_buffer_internal_1 (old_buf);
       bidi_unshelve_cache (itdata, 0);
     }
 }
diff --git a/src/keyboard.c b/src/keyboard.c
index 47b5e59..051f2f8 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2254,8 +2254,17 @@ read_decoded_event_from_main_queue (struct timespec 
*end_time,
                {
                  int i;
                  if (meta_key != 2)
-                   for (i = 0; i < n; i++)
-                     events[i] = make_fixnum (XFIXNUM (events[i]) & ~0x80);
+                   {
+                     for (i = 0; i < n; i++)
+                       {
+                         int c = XFIXNUM (events[i]);
+                         int modifier =
+                           (meta_key == 3 && c < 0x100 && (c & 0x80))
+                           ? meta_modifier
+                           : 0;
+                         events[i] = make_fixnum ((c & ~0x80) | modifier);
+                       }
+                   }
                }
              else
                {
@@ -2264,7 +2273,7 @@ read_decoded_event_from_main_queue (struct timespec 
*end_time,
                  int i;
                  for (i = 0; i < n; i++)
                    src[i] = XFIXNUM (events[i]);
-                 if (meta_key != 2)
+                 if (meta_key < 2) /* input-meta-mode is t or nil */
                    for (i = 0; i < n; i++)
                      src[i] &= ~0x80;
                  coding->destination = dest;
@@ -2282,7 +2291,18 @@ read_decoded_event_from_main_queue (struct timespec 
*end_time,
                      eassert (coding->carryover_bytes == 0);
                      n = 0;
                      while (n < coding->produced_char)
-                       events[n++] = make_fixnum (string_char_advance (&p));
+                       {
+                         int c = string_char_advance (&p);
+                         if (meta_key == 3)
+                           {
+                             int modifier
+                               = (c < 0x100 && (c & 0x80)
+                                  ? meta_modifier
+                                  : 0);
+                             c = (c & ~0x80) | modifier;
+                           }
+                         events[n++] = make_fixnum (c);
+                       }
                    }
                }
            }
@@ -3233,10 +3253,6 @@ help_char_p (Lisp_Object c)
 static void
 record_char (Lisp_Object c)
 {
-  /* quail.el binds this to avoid recording keys twice.  */
-  if (inhibit_record_char)
-    return;
-
   int recorded = 0;
 
   if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), 
Qmouse_movement)))
@@ -5022,6 +5038,10 @@ static short const internal_border_parts[] = {
 
 static Lisp_Object button_down_location;
 
+/* A cons recording the original frame-relative x and y coordinates of
+   the down mouse event.  */
+static Lisp_Object frame_relative_event_pos;
+
 /* Information about the most recent up-going button event:  Which
    button, what location, and what time.  */
 
@@ -5673,6 +5693,7 @@ make_lispy_event (struct input_event *event)
              double_click_count = 1;
            button_down_time = event->timestamp;
            *start_pos_ptr = Fcopy_alist (position);
+           frame_relative_event_pos = Fcons (event->x, event->y);
            ignore_mouse_drag_p = false;
          }
 
@@ -5695,20 +5716,12 @@ make_lispy_event (struct input_event *event)
              ignore_mouse_drag_p = false;
            else
              {
-               Lisp_Object new_down, down;
                intmax_t xdiff = double_click_fuzz, ydiff = double_click_fuzz;
 
-               /* The third element of every position
-                  should be the (x,y) pair.  */
-               down = Fcar (Fcdr (Fcdr (start_pos)));
-               new_down = Fcar (Fcdr (Fcdr (position)));
-
-               if (CONSP (down)
-                   && FIXNUMP (XCAR (down)) && FIXNUMP (XCDR (down)))
-                 {
-                   xdiff = XFIXNUM (XCAR (new_down)) - XFIXNUM (XCAR (down));
-                   ydiff = XFIXNUM (XCDR (new_down)) - XFIXNUM (XCDR (down));
-                 }
+               xdiff = XFIXNUM (event->x)
+                 - XFIXNUM (XCAR (frame_relative_event_pos));
+               ydiff = XFIXNUM (event->y)
+                 - XFIXNUM (XCDR (frame_relative_event_pos));
 
                if (! (0 < double_click_fuzz
                       && - double_click_fuzz < xdiff
@@ -5725,12 +5738,51 @@ make_lispy_event (struct input_event *event)
                          a click.  But mouse-drag-region completely ignores
                          this case and it hasn't caused any real problem, so
                          it's probably OK to ignore it as well.  */
-                      && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position)))))
+                      && (EQ (Fcar (Fcdr (start_pos)),
+                              Fcar (Fcdr (position))) /* Same buffer pos */
+                          || !EQ (Fcar (start_pos),
+                                  Fcar (position))))) /* Different window */
                  {
                    /* Mouse has moved enough.  */
                    button_down_time = 0;
                    click_or_drag_modifier = drag_modifier;
                  }
+               else if (((!EQ (Fcar (start_pos), Fcar (position)))
+                         || (!EQ (Fcar (Fcdr (start_pos)),
+                                  Fcar (Fcdr (position)))))
+                        /* Was the down event in a window body? */
+                        && FIXNUMP (Fcar (Fcdr (start_pos)))
+                        && WINDOW_LIVE_P (Fcar (start_pos))
+                        && !NILP (Ffboundp (Qwindow_edges)))
+                 /* If the window (etc.) at the mouse position has
+                    changed between the down event and the up event,
+                    we assume there's been a redisplay between the
+                    two events, and we pretend the mouse is still in
+                    the old window to prevent a spurious drag event
+                    being generated.  */
+                 {
+                   Lisp_Object edges
+                     = call4 (Qwindow_edges, Fcar (start_pos), Qt, Qnil, Qt);
+                   int new_x = XFIXNUM (Fcar (frame_relative_event_pos));
+                   int new_y = XFIXNUM (Fcdr (frame_relative_event_pos));
+
+                   /* If the up-event is outside the down-event's
+                      window, use coordinates that are within it.  */
+                   if (new_x < XFIXNUM (Fcar (edges)))
+                     new_x = XFIXNUM (Fcar (edges));
+                   else if (new_x >= XFIXNUM (Fcar (Fcdr (Fcdr (edges)))))
+                     new_x = XFIXNUM (Fcar (Fcdr (Fcdr (edges)))) - 1;
+                   if (new_y < XFIXNUM (Fcar (Fcdr (edges))))
+                     new_y = XFIXNUM (Fcar (Fcdr (edges)));
+                   else if (new_y
+                            >= XFIXNUM (Fcar (Fcdr (Fcdr (Fcdr (edges))))))
+                     new_y = XFIXNUM (Fcar (Fcdr (Fcdr (Fcdr (edges))))) - 1;
+
+                   position = make_lispy_position
+                     (XFRAME (event->frame_or_window),
+                      make_fixnum (new_x), make_fixnum (new_y),
+                      event->timestamp);
+                 }
              }
 
            /* Don't check is_double; treat this as multiple if the
@@ -7036,7 +7088,7 @@ tty_read_avail_input (struct terminal *terminal,
       buf.modifiers = 0;
       if (tty->meta_key == 1 && (cbuf[i] & 0x80))
         buf.modifiers = meta_modifier;
-      if (tty->meta_key != 2)
+      if (tty->meta_key < 2)
         cbuf[i] &= ~0x80;
 
       buf.code = cbuf[i];
@@ -11043,7 +11095,10 @@ See also `current-input-mode'.  */)
 DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 
2, 0,
        doc: /* Enable or disable 8-bit input on TERMINAL.
 If META is t, Emacs will accept 8-bit input, and interpret the 8th
-bit as the Meta modifier.
+bit as the Meta modifier before it decodes the characters.
+
+If META is `encoded', Emacs will interpret the 8th bit of single-byte
+characters after decoding the characters.
 
 If META is nil, Emacs will ignore the top bit, on the assumption it is
 parity.
@@ -11072,6 +11127,8 @@ See also `current-input-mode'.  */)
     new_meta = 0;
   else if (EQ (meta, Qt))
     new_meta = 1;
+  else if (EQ (meta, Qencoded))
+    new_meta = 3;
   else
     new_meta = 2;
 
@@ -11134,6 +11191,8 @@ Second arg FLOW non-nil means use ^S/^Q flow control 
for output to terminal
  (no effect except in CBREAK mode).
 Third arg META t means accept 8-bit input (for a Meta key).
  META nil means ignore the top bit, on the assumption it is parity.
+ META `encoded' means accept 8-bit input and interpret Meta after
+   decoding the input characters.
  Otherwise, accept 8-bit input and don't use the top bit for Meta.
 Optional fourth arg QUIT if non-nil specifies character to use for quitting.
 See also `current-input-mode'.  */)
@@ -11154,9 +11213,12 @@ The value is a list of the form (INTERRUPT FLOW META 
QUIT), where
     nil, Emacs is using CBREAK mode.
   FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
     terminal; this does not apply if Emacs uses interrupt-driven input.
-  META is t if accepting 8-bit input with 8th bit as Meta flag.
-    META nil means ignoring the top bit, on the assumption it is parity.
-    META is neither t nor nil if accepting 8-bit input and using
+  META is t if accepting 8-bit unencoded input with 8th bit as Meta flag.
+  META is `encoded' if accepting 8-bit encoded input with 8th bit as
+    Meta flag which has to be interpreted after decoding the input.
+  META is nil if ignoring the top bit of input, on the assumption that
+    it is a parity bit.
+  META is neither t nor nil if accepting 8-bit input and using
     all 8 bits as the character code.
   QUIT is the character Emacs currently uses to quit.
 The elements of this list correspond to the arguments of
@@ -11172,7 +11234,9 @@ The elements of this list correspond to the arguments of
       flow = FRAME_TTY (sf)->flow_control ? Qt : Qnil;
       meta = (FRAME_TTY (sf)->meta_key == 2
              ? make_fixnum (0)
-             : (CURTTY ()->meta_key == 1 ? Qt : Qnil));
+             : (CURTTY ()->meta_key == 1
+                ? Qt
+                : (CURTTY ()->meta_key == 3 ? Qencoded : Qnil)));
     }
   else
     {
@@ -11649,6 +11713,7 @@ syms_of_keyboard (void)
   DEFSYM (Qmake_frame_visible, "make-frame-visible");
   DEFSYM (Qselect_window, "select-window");
   DEFSYM (Qselection_request, "selection-request");
+  DEFSYM (Qwindow_edges, "window-edges");
   {
     int i;
 
@@ -11662,9 +11727,11 @@ syms_of_keyboard (void)
       }
   }
   DEFSYM (Qno_record, "no-record");
+  DEFSYM (Qencoded, "encoded");
 
   button_down_location = make_nil_vector (5);
   staticpro (&button_down_location);
+  staticpro (&frame_relative_event_pos);
   mouse_syms = make_nil_vector (5);
   staticpro (&mouse_syms);
   wheel_syms = make_nil_vector (ARRAYELTS (lispy_wheel_names));
@@ -12269,7 +12336,10 @@ Called with three arguments:
 - the error data, a list of the form (SIGNALED-CONDITION . SIGNAL-DATA)
   such as what `condition-case' would bind its variable to,
 - the context (a string which normally goes at the start of the message),
-- the Lisp function within which the error was signaled.  */);
+- the Lisp function within which the error was signaled.
+
+Also see `set-message-function' (which controls how non-error messages
+are displayed).  */);
   Vcommand_error_function = intern ("command-error-default-function");
 
   DEFVAR_LISP ("enable-disabled-menus-and-buttons",
@@ -12343,13 +12413,6 @@ If nil, Emacs crashes immediately in response to fatal 
signals.  */);
                Vwhile_no_input_ignore_events,
                doc: /* Ignored events from while-no-input.  */);
 
-  DEFVAR_BOOL ("inhibit--record-char",
-              inhibit_record_char,
-              doc: /* If non-nil, don't record input events.
-This inhibits recording input events for the purposes of keyboard
-macros, dribble file, and `recent-keys'.
-Internal use only.  */);
-
   pdumper_do_now_and_after_load (syms_of_keyboard_for_pdumper);
 }
 
@@ -12383,8 +12446,6 @@ syms_of_keyboard_for_pdumper (void)
   /* Create the initial keyboard.  Qt means 'unset'.  */
   eassert (initial_kboard == NULL);
   initial_kboard = allocate_kboard (Qt);
-
-  inhibit_record_char = false;
 }
 
 void
diff --git a/src/lisp.h b/src/lisp.h
index f83c55f..4fb8923 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4064,10 +4064,10 @@ extern ptrdiff_t doprnt (char *, ptrdiff_t, const char 
*, const char *,
                         va_list);
 extern ptrdiff_t esprintf (char *, char const *, ...)
   ATTRIBUTE_FORMAT_PRINTF (2, 3);
-extern ptrdiff_t exprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+extern ptrdiff_t exprintf (char **, ptrdiff_t *, char *, ptrdiff_t,
                           char const *, ...)
   ATTRIBUTE_FORMAT_PRINTF (5, 6);
-extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char *, ptrdiff_t,
                            char const *, va_list)
   ATTRIBUTE_FORMAT_PRINTF (5, 0);
 
@@ -4377,6 +4377,7 @@ extern EMACS_INT this_minibuffer_depth (Lisp_Object);
 extern EMACS_INT minibuf_level;
 extern Lisp_Object get_minibuffer (EMACS_INT);
 extern void init_minibuf_once (void);
+extern void set_initial_minibuffer_mode (void);
 extern void syms_of_minibuf (void);
 extern void barf_if_interaction_inhibited (void);
 
diff --git a/src/lread.c b/src/lread.c
index e53e1f6..a6c2db5 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1700,7 +1700,7 @@ maybe_swap_for_eln (bool no_native, Lisp_Object 
*filename, int *fd,
     return;
 
   /* Search eln in the eln-cache directories.  */
-  Lisp_Object eln_path_tail = Vcomp_eln_load_path;
+  Lisp_Object eln_path_tail = Vnative_comp_eln_load_path;
   Lisp_Object src_name =
     Fsubstring (*filename, Qnil, make_fixnum (-1));
   if (NILP (Ffile_exists_p (src_name)))
@@ -1708,7 +1708,8 @@ maybe_swap_for_eln (bool no_native, Lisp_Object 
*filename, int *fd,
       src_name = concat2 (src_name, build_string (".gz"));
       if (NILP (Ffile_exists_p (src_name)))
        {
-         if (!NILP (find_symbol_value (Qcomp_warning_on_missing_source)))
+         if (!NILP (find_symbol_value (
+                      Qnative_comp_warning_on_missing_source)))
            call2 (intern_c_string ("display-warning"),
                   Qcomp,
                   CALLN (Fformat,
@@ -1944,7 +1945,17 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object 
suffixes,
              }
            else
              {
-               fd = emacs_open (pfn, O_RDONLY, 0);
+                /*  In some systems (like Windows) finding out if a
+                    file exists is cheaper to do than actually opening
+                    it.  Only open the file when we are sure that it
+                    exists.  */
+#ifdef WINDOWSNT
+                if (faccessat (AT_FDCWD, pfn, R_OK, AT_EACCESS))
+                  fd = -1;
+                else
+#endif
+                  fd = emacs_open (pfn, O_RDONLY, 0);
+
                if (fd < 0)
                  {
                    if (! (errno == ENOENT || errno == ENOTDIR))
@@ -3927,8 +3938,7 @@ string_to_number (char const *string, int base, ptrdiff_t 
*plen)
   bool signedp = negative | positive;
   cp += signedp;
 
-  enum { INTOVERFLOW = 1, LEAD_INT = 2, DOT_CHAR = 4, TRAIL_INT = 8,
-        E_EXP = 16 };
+  enum { INTOVERFLOW = 1, LEAD_INT = 2, TRAIL_INT = 4, E_EXP = 16 };
   int state = 0;
   int leading_digit = digit_to_number (*cp, base);
   uintmax_t n = leading_digit;
@@ -3948,7 +3958,6 @@ string_to_number (char const *string, int base, ptrdiff_t 
*plen)
   char const *after_digits = cp;
   if (*cp == '.')
     {
-      state |= DOT_CHAR;
       cp++;
     }
 
@@ -3997,8 +4006,10 @@ string_to_number (char const *string, int base, 
ptrdiff_t *plen)
            cp = ecp;
        }
 
-      float_syntax = ((state & (DOT_CHAR|TRAIL_INT)) == (DOT_CHAR|TRAIL_INT)
-                     || (state & ~INTOVERFLOW) == (LEAD_INT|E_EXP));
+      /* A float has digits after the dot or an exponent.
+        This excludes numbers like "1." which are lexed as integers. */
+      float_syntax = ((state & TRAIL_INT)
+                     || ((state & LEAD_INT) && (state & E_EXP)));
     }
 
   if (plen)
@@ -4758,14 +4769,8 @@ load_path_default (void)
     return decode_env_path (0, PATH_DUMPLOADSEARCH, 0);
 
   Lisp_Object lpath = Qnil;
-  const char *normal = PATH_LOADSEARCH;
-  const char *loadpath = NULL;
-
-#ifdef HAVE_NS
-  loadpath = ns_load_path ();
-#endif
 
-  lpath = decode_env_path (0, loadpath ? loadpath : normal, 0);
+  lpath = decode_env_path (0, PATH_LOADSEARCH, 0);
 
   if (!NILP (Vinstallation_directory))
     {
diff --git a/src/minibuf.c b/src/minibuf.c
index c4482d7..1b842b7 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -157,16 +157,15 @@ zip_minibuffer_stacks (Lisp_Object dest_window, 
Lisp_Object source_window)
       Fset_window_start (dest_window, Fwindow_start (source_window), Qnil);
       Fset_window_point (dest_window, Fwindow_point (source_window));
       dw->prev_buffers = sw->prev_buffers;
-      set_window_buffer (source_window, get_minibuffer (0), 0, 0);
+      set_window_buffer (source_window, nth_minibuffer (0), 0, 0);
       sw->prev_buffers = Qnil;
       return;
     }
 
   if (live_minibuffer_p (dw->contents))
-    call1 (Qrecord_window_buffer, dest_window);
+    call1 (Qpush_window_buffer_onto_prev, dest_window);
   if (live_minibuffer_p (sw->contents))
-    call1 (Qrecord_window_buffer, source_window);
-
+    call1 (Qpush_window_buffer_onto_prev, source_window);
   acc = merge_c (dw->prev_buffers, sw->prev_buffers, minibuffer_ent_greater);
 
   if (!NILP (acc))
@@ -179,7 +178,7 @@ zip_minibuffer_stacks (Lisp_Object dest_window, Lisp_Object 
source_window)
     }
   dw->prev_buffers = acc;
   sw->prev_buffers = Qnil;
-  set_window_buffer (source_window, get_minibuffer (0), 0, 0);
+  set_window_buffer (source_window, nth_minibuffer (0), 0, 0);
 }
 
 /* If `minibuffer_follows_selected_frame' is t, or we're about to
@@ -204,6 +203,14 @@ move_minibuffers_onto_frame (struct frame *of, bool 
for_deletion)
       zip_minibuffer_stacks (f->minibuffer_window, of->minibuffer_window);
       if (for_deletion && XFRAME (MB_frame) != of)
        MB_frame = selected_frame;
+      if (!for_deletion
+         && MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (of))))
+       {
+         Lisp_Object old_frame;
+         XSETFRAME (old_frame, of);
+         Fset_frame_selected_window (old_frame,
+                                     Fframe_first_window (old_frame), Qnil);
+       }
     }
 }
 
@@ -212,7 +219,25 @@ DEFUN ("active-minibuffer-window", 
Factive_minibuffer_window,
        doc: /* Return the currently active minibuffer window, or nil if none.  
*/)
      (void)
 {
-  return minibuf_level ? minibuf_window : Qnil;
+  Lisp_Object frames, frame;
+  struct frame *f;
+  Lisp_Object innermost_MB;
+
+  if (!minibuf_level)
+    return Qnil;
+
+  innermost_MB = nth_minibuffer (minibuf_level);
+  if (NILP (innermost_MB))
+    emacs_abort ();
+  FOR_EACH_FRAME (frames, frame)
+    {
+      f = XFRAME (frame);
+      if (FRAME_LIVE_P (f)
+         && WINDOW_LIVE_P (f->minibuffer_window)
+         && EQ (XWINDOW (f->minibuffer_window)->contents, innermost_MB))
+       return f->minibuffer_window;
+    }
+  return minibuf_window;       /* "Can't happen." */
 }
 
 DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
@@ -628,7 +653,12 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
       return unbind_to (count, val);
     }
 
-  minibuf_level++;         /* Before calling choose_minibuf_frame.  */
+  /* Ensure now that the latest minibuffer has been created and pushed
+     onto Vminibuffer_list before incrementing minibuf_level, in case
+     a hook called during the minibuffer creation calls
+     Factive_minibuffer_window.  */
+  minibuffer = get_minibuffer (minibuf_level + 1);
+  minibuf_level++;             /* Before calling choose_minibuf_frame.  */
 
   /* Choose the minibuffer window and frame, and take action on them.  */
 
@@ -656,7 +686,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
     }
   MB_frame = XWINDOW (XFRAME (selected_frame)->minibuffer_window)->frame;
   if (live_minibuffer_p (XWINDOW (minibuf_window)->contents))
-    call1 (Qrecord_window_buffer, minibuf_window);
+    call1 (Qpush_window_buffer_onto_prev, minibuf_window);
 
   record_unwind_protect_void (minibuffer_unwind);
   record_unwind_protect (restore_window_configuration,
@@ -742,7 +772,6 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
 
   /* Switch to the minibuffer.  */
 
-  minibuffer = get_minibuffer (minibuf_level);
   set_minibuffer_mode (minibuffer, minibuf_level);
   Fset_buffer (minibuffer);
 
@@ -783,7 +812,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
   /* Empty out the minibuffers of all frames, except those frames
      where there is an active minibuffer.
      Set them to point to ` *Minibuf-0*', which is always empty.  */
-  empty_minibuf = get_minibuffer (0);
+  empty_minibuf = nth_minibuffer (0);
   set_minibuffer_mode (empty_minibuf, 0);
 
   /* Display this minibuffer in the proper window.  */
@@ -945,7 +974,7 @@ static Lisp_Object
 nth_minibuffer (EMACS_INT depth)
 {
   Lisp_Object tail = Fnthcdr (make_fixnum (depth), Vminibuffer_list);
-  return XCAR (tail);
+  return Fcar (tail);
 }
 
 /* Set the major mode of the minibuffer BUF, depending on DEPTH, the
@@ -1050,9 +1079,13 @@ read_minibuf_unwind (void)
   Lisp_Object future_mini_window;
   Lisp_Object saved_selected_frame = selected_frame;
   Lisp_Object window, frames;
+  Lisp_Object expired_MB = nth_minibuffer (minibuf_level);
   struct window *w;
   struct frame *f;
 
+  if (NILP (expired_MB))
+    emacs_abort ();
+
   /* Locate the expired minibuffer.  */
   FOR_EACH_FRAME (frames, exp_MB_frame)
     {
@@ -1062,7 +1095,7 @@ read_minibuf_unwind (void)
        {
          w = XWINDOW (window);
          if (EQ (w->frame, exp_MB_frame)
-             && EQ (w->contents, nth_minibuffer (minibuf_level)))
+             && EQ (w->contents, expired_MB))
            goto found;
        }
     }
@@ -1078,7 +1111,7 @@ read_minibuf_unwind (void)
      minibuffer when we reset the relevant variables.  Don't depend on
      `minibuf_window' here.  This could by now be the mini-window of any
      frame.  */
-  Fset_buffer (nth_minibuffer (minibuf_level));
+  Fset_buffer (expired_MB);
   minibuf_level--;
 
   /* Restore prompt, etc, from outer minibuffer level.  */
@@ -1177,7 +1210,7 @@ read_minibuf_unwind (void)
                     WINDOW_FRAME (XWINDOW (minibuf_window))))
            Fset_frame_selected_window (selected_frame, prev, Qnil);
        }
-      else
+      else if (WINDOW_LIVE_P (calling_window))
        Fset_frame_selected_window (calling_frame, calling_window, Qnil);
     }
 
@@ -2238,6 +2271,13 @@ If no minibuffer is active, return nil.  */)
 
 
 
+void
+set_initial_minibuffer_mode (void)
+{
+  Lisp_Object minibuf = get_minibuffer (0);
+  set_minibuffer_mode (minibuf, 0);
+}
+
 static void init_minibuf_once_for_pdumper (void);
 
 void
@@ -2246,6 +2286,8 @@ init_minibuf_once (void)
   staticpro (&Vminibuffer_list);
   staticpro (&Vcommand_loop_level_list);
   pdumper_do_now_and_after_load (init_minibuf_once_for_pdumper);
+  /* Ensure our inactive minibuffer exists.  */
+  get_minibuffer (0);
 }
 
 static void
@@ -2311,6 +2353,7 @@ syms_of_minibuf (void)
   DEFSYM (Qminibuffer_completing_file_name, "minibuffer-completing-file-name");
   DEFSYM (Qselect_frame_set_input_focus, "select-frame-set-input-focus");
   DEFSYM (Qadd_to_history, "add-to-history");
+  DEFSYM (Qpush_window_buffer_onto_prev, "push-window-buffer-onto-prev");
 
   DEFVAR_LISP ("read-expression-history", Vread_expression_history,
               doc: /* A history list for arguments that are Lisp expressions 
to evaluate.
@@ -2342,7 +2385,7 @@ default top level value is used.  */);
   Vminibuffer_setup_hook = Qnil;
 
   DEFVAR_LISP ("minibuffer-exit-hook", Vminibuffer_exit_hook,
-              doc: /* Normal hook run just after exit from minibuffer.  */);
+              doc: /* Normal hook run whenever a minibuffer is exited.  */);
   Vminibuffer_exit_hook = Qnil;
 
   DEFVAR_LISP ("history-length", Vhistory_length,
diff --git a/src/nsfns.m b/src/nsfns.m
index 054777a..454a6fd 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -668,11 +668,7 @@ ns_set_tool_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
        }
     }
 
-  {
-    NSTRACE_MSG ("inhibit:%d", inhibit);
-
-    adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines);
-  }
+  adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines);
 }
 
 static void
@@ -1070,7 +1066,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   Lisp_Object parent, parent_frame;
   struct kboard *kb;
   static int desc_ctr = 1;
-  int x_width = 0, x_height = 0;
 
   /* gui_display_get_arg modifies parms.  */
   parms = Fcopy_alist (parms);
@@ -1409,6 +1404,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
       else
         {
          /* Must have been Qnil.  */
+         f->was_invisible = true;
         }
     }
 
@@ -1957,8 +1953,11 @@ DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
        doc: /* If ON is non-nil, the entire Emacs application is hidden.
 Otherwise if Emacs is hidden, it is unhidden.
 If ON is equal to `activate', Emacs is unhidden and becomes
-the active application.  */)
-     (Lisp_Object on)
+the active application.
+If ON is equal to `activate-front', Emacs is unhidden and
+becomes the active application, but only the selected frame
+is layered in front of the windows of other applications.  */)
+  (Lisp_Object on)
 {
   check_window_system (NULL);
   if (EQ (on, intern ("activate")))
@@ -1966,6 +1965,12 @@ the active application.  */)
       [NSApp unhide: NSApp];
       [NSApp activateIgnoringOtherApps: YES];
     }
+  else if (EQ (on, intern ("activate-front")))
+    {
+      [NSApp unhide: NSApp];
+      [[NSRunningApplication currentApplication]
+        activateWithOptions: NSApplicationActivateIgnoringOtherApps];
+    }
   else if (NILP (on))
     [NSApp unhide: NSApp];
   else
@@ -3028,7 +3033,8 @@ all_nonzero_ascii (unsigned char *str, ptrdiff_t n)
 }
 
 @implementation NSString (EmacsString)
-/* Make an NSString from a Lisp string.  */
+/* Make an NSString from a Lisp string.  STRING must not be in an
+   encoded form (e.g. UTF-8).  */
 + (NSString *)stringWithLispString:(Lisp_Object)string
 {
   /* Shortcut for the common case.  */
diff --git a/src/nsfont.m b/src/nsfont.m
index f4f0d28..06e10d5 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -700,7 +700,7 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int 
pixel_size)
      when setting family in ns_spec_to_descriptor().  */
   if (ns_attribute_fvalue (fontDesc, NSFontWeightTrait) > 0.50F)
       traits |= NSBoldFontMask;
-  if (fabs (ns_attribute_fvalue (fontDesc, NSFontSlantTrait) > 0.05F))
+  if (ns_attribute_fvalue (fontDesc, NSFontSlantTrait) > 0.05F)
       traits |= NSItalicFontMask;
 
   /* see 
https://web.archive.org/web/20100201175731/http://cocoadev.com/forums/comments.php?DiscussionID=74
 */
diff --git a/src/nsimage.m b/src/nsimage.m
index fa81a41..3c16cd3 100644
--- a/src/nsimage.m
+++ b/src/nsimage.m
@@ -254,15 +254,15 @@ ns_image_size_in_bytes (void *img)
   NSImageRep *imgRep;
   Lisp_Object found;
   EmacsImage *image;
+  NSString *filename;
 
   /* Search bitmap-file-path for the file, if appropriate.  */
   found = image_find_image_file (file);
   if (!STRINGP (found))
     return nil;
-  found = ENCODE_FILE (found);
+  filename = [NSString stringWithLispString:found];
 
-  image = [[EmacsImage alloc] initByReferencingFile:
-                     [NSString stringWithLispString: found]];
+  image = [[EmacsImage alloc] initByReferencingFile:filename];
 
   image->bmRep = nil;
 #ifdef NS_IMPL_COCOA
@@ -277,8 +277,7 @@ ns_image_size_in_bytes (void *img)
     }
 
   [image setSize: NSMakeSize([imgRep pixelsWide], [imgRep pixelsHigh])];
-
-  [image setName: [NSString stringWithLispString: file]];
+  [image setName:filename];
 
   return image;
 }
diff --git a/src/nsmenu.m b/src/nsmenu.m
index 24aa5a0..1b03fe9 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -73,7 +73,7 @@ free_frame_menubar (struct frame *f)
   id menu = [NSApp mainMenu];
   for (int i = [menu numberOfItems] - 1 ; i >= 0; i--)
     {
-      NSMenuItem *item = [menu itemAtIndex:i];
+      NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i];
       NSString *title = [item title];
 
       if ([ns_app_name isEqualToString:title])
@@ -358,8 +358,12 @@ ns_update_menubar (struct frame *f, bool deep_p)
       if (i < [menu numberOfItems])
         {
           NSString *titleStr = [NSString stringWithUTF8String: wv->name];
-          NSMenuItem *item = [menu itemAtIndex:i];
-          submenu = (EmacsMenu*)[item submenu];
+          NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i];
+          submenu = (EmacsMenu *)[item submenu];
+
+#ifdef NS_IMPL_GNUSTEP
+          [submenu close];
+#endif
 
           [item setTitle:titleStr];
           [submenu setTitle:titleStr];
@@ -368,8 +372,10 @@ ns_update_menubar (struct frame *f, bool deep_p)
       else
         submenu = [menu addSubmenuWithTitle: wv->name];
 
+#ifdef NS_IMPL_COCOA
       if ([[submenu title] isEqualToString:@"Help"])
         [NSApp setHelpMenu:submenu];
+#endif
 
       if (deep_p)
         [submenu fillWithWidgetValue: wv->contents];
@@ -380,6 +386,12 @@ ns_update_menubar (struct frame *f, bool deep_p)
   while (i < [menu numberOfItems])
     {
       /* Remove any extra items.  */
+#ifdef NS_IMPL_GNUSTEP
+      NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i];
+      EmacsMenu *submenu = (EmacsMenu *)[item submenu];
+      [submenu close];
+#endif
+
       [menu removeItemAtIndex:i];
     }
 
@@ -472,7 +484,7 @@ set_frame_menubar (struct frame *f, bool deep_p)
 
   if (menu_separator_name_p (wv->name))
     {
-      item = [NSMenuItem separatorItem];
+      item = (NSMenuItem *)[NSMenuItem separatorItem];
     }
   else
     {
@@ -534,7 +546,7 @@ set_frame_menubar (struct frame *f, bool deep_p)
   needsUpdate = YES;
 }
 
-
+#ifdef NS_IMPL_COCOA
 typedef struct {
   const char *from, *to;
 } subst_t;
@@ -591,17 +603,18 @@ prettify_key (const char *key)
   xfree (buf);
   return SSDATA (result);
 }
+#endif /* NS_IMPL_COCOA */
 
 - (void)fillWithWidgetValue: (void *)wvptr
 {
   widget_value *first_wv = (widget_value *)wvptr;
-  NSFont *menuFont = [NSFont menuFontOfSize:0];
   NSDictionary *attributes = nil;
 
 #ifdef NS_IMPL_COCOA
   /* Cocoa doesn't allow multi-key sequences in its menu display, so
      work around it by using tabs to split the title into two
      columns.  */
+  NSFont *menuFont = [NSFont menuFontOfSize:0];
   NSDictionary *font_attribs = @{NSFontAttributeName: menuFont};
   CGFloat maxNameWidth = 0;
   CGFloat maxKeyWidth = 0;
@@ -672,9 +685,9 @@ prettify_key (const char *key)
 - (EmacsMenu *)addSubmenuWithTitle: (const char *)title
 {
   NSString *titleStr = [NSString stringWithUTF8String: title];
-  NSMenuItem *item = [self addItemWithTitle: titleStr
-                                     action: (SEL)nil /*@selector (menuDown:) 
*/
-                              keyEquivalent: @""];
+  NSMenuItem *item = (NSMenuItem *)[self addItemWithTitle: titleStr
+                                                   action: (SEL)nil
+                                            keyEquivalent: @""];
   EmacsMenu *submenu = [[EmacsMenu alloc] initWithTitle: titleStr];
   [self setSubmenu: submenu forItem: item];
   [submenu release];
@@ -711,6 +724,44 @@ prettify_key (const char *key)
       : Qnil;
 }
 
+#ifdef NS_IMPL_GNUSTEP
+- (void) close
+{
+    /* Close all the submenus.  This has the unfortunate side-effect of
+     breaking tear-off menus, however if we don't do this then we get
+     a crash when the menus are removed during updates.  */
+  for (int i = 0 ; i < [self numberOfItems] ; i++)
+    {
+      NSMenuItem *item = [self itemAtIndex:i];
+      if ([item hasSubmenu])
+        [(EmacsMenu *)[item submenu] close];
+    }
+
+  [super close];
+}
+
+/* GNUstep seems to have a number of required methods in
+   NSMenuDelegate that are optional in Cocoa.  */
+
+- (void) menuWillOpen:(NSMenu *)menu
+{
+}
+
+- (void) menuDidClose:(NSMenu *)menu
+{
+}
+
+- (NSRect)confinementRectForMenu:(NSMenu *)menu
+                        onScreen:(NSScreen *)screen
+{
+  return NSZeroRect;
+}
+
+- (void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item
+{
+}
+#endif
+
 @end  /* EmacsMenu */
 
 
diff --git a/src/nsterm.h b/src/nsterm.h
index 017c239..b29e76c 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -443,7 +443,6 @@ typedef id instancetype;
    int maximized_width, maximized_height;
    NSWindow *nonfs_window;
    BOOL fs_is_native;
-   BOOL in_fullscreen_transition;
 #ifdef NS_DRAW_TO_BUFFER
    EmacsSurface *surface;
 #endif
@@ -475,8 +474,6 @@ typedef id instancetype;
 - (void) toggleFullScreen: (id) sender;
 - (BOOL) fsIsNative;
 - (BOOL) isFullscreen;
-- (BOOL) inFullScreenTransition;
-- (void) waitFullScreenTransition;
 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
 - (void) updateCollectionBehavior;
 #endif
@@ -507,6 +504,10 @@ typedef id instancetype;
   NSPoint grabOffset;
 }
 
+#ifdef NS_IMPL_GNUSTEP
+- (NSInteger) orderedIndex;
+#endif
+
 - (BOOL)restackWindow:(NSWindow *)win above:(BOOL)above;
 - (void)setAppearance;
 @end
@@ -724,8 +725,9 @@ typedef id instancetype;
   IOSurfaceRef currentSurface;
   IOSurfaceRef lastSurface;
   CGContextRef context;
+  CGFloat scale;
 }
-- (id) initWithSize: (NSSize)s ColorSpace: (CGColorSpaceRef)cs;
+- (id) initWithSize: (NSSize)s ColorSpace: (CGColorSpaceRef)cs Scale: 
(CGFloat)scale;
 - (void) dealloc;
 - (NSSize) getSize;
 - (CGContextRef) getContext;
@@ -1188,9 +1190,7 @@ extern void ns_run_ascript (void);
 #define NSAPP_DATA2_RUNFILEDIALOG 11
 extern void ns_run_file_dialog (void);
 
-extern const char *ns_etc_directory (void);
-extern const char *ns_exec_path (void);
-extern const char *ns_load_path (void);
+extern const char *ns_relocate (const char *epath);
 extern void syms_of_nsterm (void);
 extern void syms_of_nsfns (void);
 extern void syms_of_nsmenu (void);
diff --git a/src/nsterm.m b/src/nsterm.m
index b135e35..dc5ecc4 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -499,118 +499,37 @@ append2 (Lisp_Object list, Lisp_Object item)
 
 
 const char *
-ns_etc_directory (void)
-/* If running as a self-contained app bundle, return as a string the
-   filename of the etc directory, if present; else nil.  */
-{
-  NSBundle *bundle = [NSBundle mainBundle];
-  NSString *resourceDir = [bundle resourcePath];
-  NSString *resourcePath;
-  NSFileManager *fileManager = [NSFileManager defaultManager];
-  BOOL isDir;
-
-  resourcePath = [resourceDir stringByAppendingPathComponent: @"etc"];
-  if ([fileManager fileExistsAtPath: resourcePath isDirectory: &isDir])
-    {
-      if (isDir) return [resourcePath UTF8String];
-    }
-  return NULL;
-}
+ns_relocate (const char *epath)
+/* If we're running in a self-contained app bundle some hard-coded
+   paths are relative to the root of the bundle, so work out the full
+   path.
 
-
-const char *
-ns_exec_path (void)
-/* If running as a self-contained app bundle, return as a path string
-   the filenames of the libexec and bin directories, ie libexec:bin.
-   Otherwise, return nil.
-   Normally, Emacs does not add its own bin/ directory to the PATH.
-   However, a self-contained NS build has a different layout, with
-   bin/ and libexec/ subdirectories in the directory that contains
-   Emacs.app itself.
-   We put libexec first, because init_callproc_1 uses the first
-   element to initialize exec-directory.  An alternative would be
-   for init_callproc to check for invocation-directory/libexec.
-*/
+   FIXME: I think this should be able to handle cases where multiple
+   directories are separated by colons.  */
 {
+#ifdef NS_SELF_CONTAINED
   NSBundle *bundle = [NSBundle mainBundle];
-  NSString *resourceDir = [bundle resourcePath];
-  NSString *binDir = [bundle bundlePath];
-  NSString *resourcePath, *resourcePaths;
-  NSRange range;
-  NSString *pathSeparator = [NSString stringWithFormat: @"%c", SEPCHAR];
+  NSString *root = [bundle bundlePath];
+  NSString *original = [NSString stringWithUTF8String:epath];
+  NSString *fixedPath = [NSString pathWithComponents:
+                                    [NSArray arrayWithObjects:
+                                               root, original, nil]];
   NSFileManager *fileManager = [NSFileManager defaultManager];
-  NSArray *paths;
-  NSEnumerator *pathEnum;
-  BOOL isDir;
-
-  range = [resourceDir rangeOfString: @"Contents"];
-  if (range.location != NSNotFound)
-    {
-      binDir = [binDir stringByAppendingPathComponent: @"Contents"];
-#ifdef NS_IMPL_COCOA
-      binDir = [binDir stringByAppendingPathComponent: @"MacOS"];
-#endif
-    }
 
-  paths = [binDir stringsByAppendingPaths:
-                [NSArray arrayWithObjects: @"libexec", @"bin", nil]];
-  pathEnum = [paths objectEnumerator];
-  resourcePaths = @"";
+  if (![original isAbsolutePath]
+      && [fileManager fileExistsAtPath:fixedPath isDirectory:NULL])
+    return [fixedPath UTF8String];
 
-  while ((resourcePath = [pathEnum nextObject]))
-    {
-      if ([fileManager fileExistsAtPath: resourcePath isDirectory: &isDir])
-        if (isDir)
-          {
-            if ([resourcePaths length] > 0)
-              resourcePaths
-                = [resourcePaths stringByAppendingString: pathSeparator];
-            resourcePaths
-              = [resourcePaths stringByAppendingString: resourcePath];
-          }
-    }
-  if ([resourcePaths length] > 0) return [resourcePaths UTF8String];
+  /* If we reach here either the path is absolute and therefore we
+     don't need to complete it, or we're unable to relocate the
+     file/directory.  If it's the latter it may be because the user is
+     trying to use a bundled app as though it's a Unix style install
+     and we have no way to guess what was intended, so return the
+     original string unaltered.  */
 
-  return NULL;
-}
-
-
-const char *
-ns_load_path (void)
-/* If running as a self-contained app bundle, return as a path string
-   the filenames of the site-lisp and lisp directories.
-   Ie, site-lisp:lisp.  Otherwise, return nil.  */
-{
-  NSBundle *bundle = [NSBundle mainBundle];
-  NSString *resourceDir = [bundle resourcePath];
-  NSString *resourcePath, *resourcePaths;
-  NSString *pathSeparator = [NSString stringWithFormat: @"%c", SEPCHAR];
-  NSFileManager *fileManager = [NSFileManager defaultManager];
-  BOOL isDir;
-  NSArray *paths = [resourceDir stringsByAppendingPaths:
-                              [NSArray arrayWithObjects:
-                                         @"site-lisp", @"lisp", nil]];
-  NSEnumerator *pathEnum = [paths objectEnumerator];
-  resourcePaths = @"";
-
-  /* Hack to skip site-lisp.  */
-  if (no_site_lisp) resourcePath = [pathEnum nextObject];
-
-  while ((resourcePath = [pathEnum nextObject]))
-    {
-      if ([fileManager fileExistsAtPath: resourcePath isDirectory: &isDir])
-        if (isDir)
-          {
-            if ([resourcePaths length] > 0)
-              resourcePaths
-                = [resourcePaths stringByAppendingString: pathSeparator];
-            resourcePaths
-              = [resourcePaths stringByAppendingString: resourcePath];
-          }
-    }
-  if ([resourcePaths length] > 0) return [resourcePaths UTF8String];
+#endif
 
-  return NULL;
+  return epath;
 }
 
 
@@ -1640,8 +1559,6 @@ ns_make_frame_visible (struct frame *f)
          fullscreen also.  So skip handleFS as this will print an error.  */
       if ([view fsIsNative] && [view isFullscreen])
         {
-          // maybe it is not necessary to wait
-          [view waitFullScreenTransition];
           return;
         }
 
@@ -2057,11 +1974,7 @@ ns_set_parent_frame (struct frame *f, Lisp_Object 
new_value, Lisp_Object old_val
 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
           // child frame must not be in fullscreen
           if ([view fsIsNative] && [view isFullscreen])
-            {
-              // in case child is going fullscreen
-              [view waitFullScreenTransition];
-              [view toggleFullScreen:child];
-            }
+            [view toggleFullScreen:child];
           NSTRACE ("child 
setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary");
           [child 
setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
 #endif
@@ -7296,45 +7209,49 @@ not_in_argv (NSString *arg)
 - (void)viewDidResize:(NSNotification *)notification
 {
   NSRect frame = [self frame];
-  int neww, newh;
+  int neww, newh, oldw, oldh;
 
   if (! FRAME_LIVE_P (emacsframe))
     return;
 
   NSTRACE ("[EmacsView viewDidResize]");
 
-  neww = (int)NSWidth (frame);
-  newh = (int)NSHeight (frame);
-  NSTRACE_SIZE ("New size", NSMakeSize (neww, newh));
-
 #ifdef NS_DRAW_TO_BUFFER
-  if ([self wantsUpdateLayer])
+  /* If the buffer size doesn't match the view's backing size, destroy
+     the buffer and let it be recreated at the correct size later.  */
+  if ([self wantsUpdateLayer] && surface)
     {
-      CGFloat scale = [[self window] backingScaleFactor];
-      NSSize size = [surface getSize];
-      int oldw = size.width / scale;
-      int oldh = size.height / scale;
-
-      NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
+      NSRect surfaceRect = {{0, 0}, [surface getSize]};
+      NSRect frameRect = [[self window] convertRectToBacking:frame];
 
-      /* Don't want to do anything when the view size hasn't changed. */
-      if ((oldh == newh && oldw == neww))
+      if (!NSEqualRects (frameRect, surfaceRect))
         {
-          NSTRACE_MSG ("No change");
-          return;
+          [surface release];
+          surface = nil;
+
+          [self setNeedsDisplay:YES];
         }
+    }
+#endif
 
-      [surface release];
-      surface = nil;
+  neww = (int)NSWidth (frame);
+  newh = (int)NSHeight (frame);
+  oldw = FRAME_PIXEL_WIDTH (emacsframe);
+  oldh = FRAME_PIXEL_HEIGHT (emacsframe);
 
-      [self setNeedsDisplay:YES];
+  /* Don't want to do anything when the view size hasn't changed. */
+  if (emacsframe->new_size_p
+      ? (newh == emacsframe->new_height
+         && neww == emacsframe->new_width)
+      : (oldh == newh && oldw == neww))
+    {
+      NSTRACE_MSG ("No change");
+      return;
     }
-#endif
 
-  /* I'm not sure if it's safe to call this every time the view
-     changes size, as Emacs may already know about the change.
-     Unfortunately there doesn't seem to be a bullet-proof method of
-     determining whether we need to call it or not.  */
+  NSTRACE_SIZE ("New size", NSMakeSize (neww, newh));
+  NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
+
   change_frame_size (emacsframe, neww, newh, false, YES, false);
 
   SET_FRAME_GARBAGED (emacsframe);
@@ -7485,7 +7402,6 @@ not_in_argv (NSString *arg)
 #endif
     fs_is_native = ns_use_native_fullscreen;
 #endif
-  in_fullscreen_transition = NO;
 
   maximized_width = maximized_height = -1;
   nonfs_window = nil;
@@ -7858,7 +7774,6 @@ not_in_argv (NSString *arg)
 - (void)windowWillEnterFullScreen:(NSNotification *)notification
 {
   NSTRACE ("[EmacsView windowWillEnterFullScreen:]");
-  in_fullscreen_transition = YES;
   [self windowWillEnterFullScreen];
 }
 - (void)windowWillEnterFullScreen /* provided for direct calls */
@@ -7871,7 +7786,6 @@ not_in_argv (NSString *arg)
 {
   NSTRACE ("[EmacsView windowDidEnterFullScreen:]");
   [self windowDidEnterFullScreen];
-  in_fullscreen_transition = NO;
 }
 
 - (void)windowDidEnterFullScreen /* provided for direct calls */
@@ -7910,7 +7824,6 @@ not_in_argv (NSString *arg)
 - (void)windowWillExitFullScreen:(NSNotification *)notification
 {
   NSTRACE ("[EmacsView windowWillExitFullScreen:]");
-  in_fullscreen_transition = YES;
   [self windowWillExitFullScreen];
 }
 
@@ -7930,7 +7843,6 @@ not_in_argv (NSString *arg)
 {
   NSTRACE ("[EmacsView windowDidExitFullScreen:]");
   [self windowDidExitFullScreen];
-  in_fullscreen_transition = NO;
 }
 
 - (void)windowDidExitFullScreen /* provided for direct calls */
@@ -7959,22 +7871,6 @@ not_in_argv (NSString *arg)
     [[self window] performZoom:self];
 }
 
-- (BOOL)inFullScreenTransition
-{
-  return in_fullscreen_transition;
-}
-
-- (void)waitFullScreenTransition
-{
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
-  while ([self inFullScreenTransition])
-    {
-      NSTRACE ("wait for fullscreen");
-      wait_reading_process_output (0, 300000000, 0, 1, Qnil, NULL, 0);
-    }
-#endif
-}
-
 - (BOOL)fsIsNative
 {
   return fs_is_native;
@@ -8054,14 +7950,8 @@ not_in_argv (NSString *arg)
 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
       if ([[self window] respondsToSelector: @selector(toggleFullScreen:)])
-        {
-#endif
-          [[self window] toggleFullScreen:sender];
-          // wait for fullscreen animation complete (bug#28496)
-          [self waitFullScreenTransition];
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
-        }
 #endif
+        [[self window] toggleFullScreen:sender];
 #endif
       return;
     }
@@ -8349,19 +8239,17 @@ not_in_argv (NSString *arg)
 
       surface = [[EmacsSurface alloc] initWithSize:s
                                         ColorSpace:[[[self window] colorSpace]
-                                                     CGColorSpace]];
+                                                     CGColorSpace]
+                                             Scale:scale];
 
       /* Since we're using NSViewLayerContentsRedrawOnSetNeedsDisplay
          the layer's scale factor is not set automatically, so do it
          now.  */
-      [[self layer] setContentsScale:[[self window] backingScaleFactor]];
+      [[self layer] setContentsScale:scale];
     }
 
   CGContextRef context = [surface getContext];
 
-  CGContextTranslateCTM(context, 0, [surface getSize].height);
-  CGContextScaleCTM(context, scale, -scale);
-
   [NSGraphicsContext
     setCurrentContext:[NSGraphicsContext
                         graphicsContextWithCGContext:context
@@ -8374,7 +8262,6 @@ not_in_argv (NSString *arg)
   NSTRACE ("[EmacsView unfocusDrawingBuffer]");
 
   [NSGraphicsContext setCurrentContext:nil];
-  [surface releaseContext];
   [self setNeedsDisplay:YES];
 }
 
@@ -8512,7 +8399,11 @@ not_in_argv (NSString *arg)
      There's a private method, -[CALayer setContentsChanged], that we
      could use to force it, but we shouldn't often get the same
      surface twice in a row.  */
+  [surface releaseContext];
   [[self layer] setContents:(id)[surface getSurface]];
+  [surface performSelectorOnMainThread:@selector (getContext)
+                            withObject:nil
+                         waitUntilDone:NO];
 }
 #endif
 
@@ -8791,6 +8682,16 @@ not_in_argv (NSString *arg)
 }
 
 
+#ifdef NS_IMPL_GNUSTEP
+/* orderedIndex isn't yet available in GNUstep, but it seems pretty
+   easy to implement.  */
+- (NSInteger) orderedIndex
+{
+  return [[NSApp orderedWindows] indexOfObjectIdenticalTo:self];
+}
+#endif
+
+
 /* The array returned by [NSWindow parentWindow] may already be
    sorted, but the documentation doesn't tell us whether or not it is,
    so to be safe we'll sort it.  */
@@ -9713,17 +9614,20 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
    probably be some sort of pruning job that removes excess
    surfaces.  */
 
+#define CACHE_MAX_SIZE 2
 
 - (id) initWithSize: (NSSize)s
          ColorSpace: (CGColorSpaceRef)cs
+              Scale: (CGFloat)scl
 {
   NSTRACE ("[EmacsSurface initWithSize:ColorSpace:]");
 
   [super init];
 
-  cache = [[NSMutableArray arrayWithCapacity:3] retain];
+  cache = [[NSMutableArray arrayWithCapacity:CACHE_MAX_SIZE] retain];
   size = s;
   colorSpace = cs;
+  scale = scl;
 
   return self;
 }
@@ -9736,8 +9640,6 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
 
   if (currentSurface)
     CFRelease (currentSurface);
-  if (lastSurface)
-    CFRelease (lastSurface);
 
   for (id object in cache)
     CFRelease ((IOSurfaceRef)object);
@@ -9760,50 +9662,66 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
    calls cannot be nested.  */
 - (CGContextRef) getContext
 {
-  IOSurfaceRef surface = NULL;
+  NSTRACE ("[EmacsSurface getContext]");
 
-  NSTRACE ("[EmacsSurface getContextWithSize:]");
-  NSTRACE_MSG ("IOSurface count: %lu", [cache count] + (lastSurface ? 1 : 0));
-
-  for (id object in cache)
+  if (!context)
     {
-      if (!IOSurfaceIsInUse ((IOSurfaceRef)object))
-      {
-        surface = (IOSurfaceRef)object;
-        [cache removeObject:object];
-        break;
-      }
-    }
+      IOSurfaceRef surface = NULL;
 
-  if (!surface)
-    {
-      int bytesPerRow = IOSurfaceAlignProperty (kIOSurfaceBytesPerRow,
-                                                size.width * 4);
+      NSTRACE_MSG ("IOSurface count: %lu", [cache count] + (lastSurface ? 1 : 
0));
 
-      surface = IOSurfaceCreate
-        ((CFDictionaryRef)@{(id)kIOSurfaceWidth:[NSNumber 
numberWithInt:size.width],
-            (id)kIOSurfaceHeight:[NSNumber numberWithInt:size.height],
-            (id)kIOSurfaceBytesPerRow:[NSNumber numberWithInt:bytesPerRow],
-            (id)kIOSurfaceBytesPerElement:[NSNumber numberWithInt:4],
-            (id)kIOSurfacePixelFormat:[NSNumber 
numberWithUnsignedInt:'BGRA']});
-    }
+      for (id object in cache)
+        {
+          if (!IOSurfaceIsInUse ((IOSurfaceRef)object))
+            {
+              surface = (IOSurfaceRef)object;
+              [cache removeObject:object];
+              break;
+            }
+        }
 
-  IOReturn lockStatus = IOSurfaceLock (surface, 0, nil);
-  if (lockStatus != kIOReturnSuccess)
-    NSLog (@"Failed to lock surface: %x", lockStatus);
+      if (!surface && [cache count] >= CACHE_MAX_SIZE)
+        {
+          /* Just grab the first one off the cache.  This may result
+             in tearing effects.  The alternative is to wait for one
+             of the surfaces to become free.  */
+          surface = (IOSurfaceRef)[cache firstObject];
+          [cache removeObject:(id)surface];
+        }
+      else if (!surface)
+        {
+          int bytesPerRow = IOSurfaceAlignProperty (kIOSurfaceBytesPerRow,
+                                                    size.width * 4);
+
+          surface = IOSurfaceCreate
+            ((CFDictionaryRef)@{(id)kIOSurfaceWidth:[NSNumber 
numberWithInt:size.width],
+                (id)kIOSurfaceHeight:[NSNumber numberWithInt:size.height],
+                (id)kIOSurfaceBytesPerRow:[NSNumber numberWithInt:bytesPerRow],
+                (id)kIOSurfaceBytesPerElement:[NSNumber numberWithInt:4],
+                (id)kIOSurfacePixelFormat:[NSNumber 
numberWithUnsignedInt:'BGRA']});
+        }
 
-  [self copyContentsTo:surface];
+      IOReturn lockStatus = IOSurfaceLock (surface, 0, nil);
+      if (lockStatus != kIOReturnSuccess)
+        NSLog (@"Failed to lock surface: %x", lockStatus);
 
-  currentSurface = surface;
+      [self copyContentsTo:surface];
+
+      currentSurface = surface;
+
+      context = CGBitmapContextCreate (IOSurfaceGetBaseAddress 
(currentSurface),
+                                       IOSurfaceGetWidth (currentSurface),
+                                       IOSurfaceGetHeight (currentSurface),
+                                       8,
+                                       IOSurfaceGetBytesPerRow 
(currentSurface),
+                                       colorSpace,
+                                       (kCGImageAlphaPremultipliedFirst
+                                        | kCGBitmapByteOrder32Host));
+
+      CGContextTranslateCTM(context, 0, size.height);
+      CGContextScaleCTM(context, scale, -scale);
+    }
 
-  context = CGBitmapContextCreate (IOSurfaceGetBaseAddress (currentSurface),
-                                   IOSurfaceGetWidth (currentSurface),
-                                   IOSurfaceGetHeight (currentSurface),
-                                   8,
-                                   IOSurfaceGetBytesPerRow (currentSurface),
-                                   colorSpace,
-                                   (kCGImageAlphaPremultipliedFirst
-                                    | kCGBitmapByteOrder32Host));
   return context;
 }
 
@@ -9814,6 +9732,9 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
 {
   NSTRACE ("[EmacsSurface releaseContextAndGetSurface]");
 
+  if (!context)
+    return;
+
   CGContextRelease (context);
   context = NULL;
 
@@ -9821,11 +9742,8 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
   if (lockStatus != kIOReturnSuccess)
     NSLog (@"Failed to unlock surface: %x", lockStatus);
 
-  /* Put lastSurface back on the end of the cache.  It may not have
-     been displayed on the screen yet, but we probably want the new
-     data and not some stale data anyway.  */
-  if (lastSurface)
-    [cache addObject:(id)lastSurface];
+  /* Put currentSurface back on the end of the cache.  */
+  [cache addObject:(id)currentSurface];
   lastSurface = currentSurface;
   currentSurface = NULL;
 }
@@ -9850,7 +9768,7 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
 
   NSTRACE ("[EmacsSurface copyContentsTo:]");
 
-  if (! lastSurface)
+  if (!lastSurface || lastSurface == destination)
     return;
 
   lockStatus = IOSurfaceLock (lastSurface, kIOSurfaceLockReadOnly, nil);
@@ -9870,6 +9788,7 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
     NSLog (@"Failed to unlock source surface: %x", lockStatus);
 }
 
+#undef CACHE_MAX_SIZE
 
 @end /* EmacsSurface */
 
diff --git a/src/pdumper.c b/src/pdumper.c
index dfc7388..7730ea3 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -489,6 +489,10 @@ struct dump_context
 {
   /* Header we'll write to the dump file when done.  */
   struct dump_header header;
+  /* Data that will be written to the dump file.  */
+  void *buf;
+  dump_off buf_size;
+  dump_off max_offset;
 
   Lisp_Object old_purify_flag;
   Lisp_Object old_post_gc_hook;
@@ -597,6 +601,13 @@ static struct link_weight const
 
 /* Dump file creation */
 
+static void dump_grow_buffer (struct dump_context *ctx)
+{
+  ctx->buf = xrealloc (ctx->buf, ctx->buf_size = (ctx->buf_size ?
+                                                 (ctx->buf_size * 2)
+                                                 : 8 * 1024 * 1024));
+}
+
 static dump_off dump_object (struct dump_context *ctx, Lisp_Object object);
 static dump_off dump_object_for_offset (struct dump_context *ctx,
                                        Lisp_Object object);
@@ -763,8 +774,9 @@ dump_write (struct dump_context *ctx, const void *buf, 
dump_off nbyte)
   eassert (nbyte == 0 || buf != NULL);
   eassert (ctx->obj_offset == 0);
   eassert (ctx->flags.dump_object_contents);
-  if (emacs_write (ctx->fd, buf, nbyte) < nbyte)
-    report_file_error ("Could not write to dump file", ctx->dump_filename);
+  while (ctx->offset + nbyte > ctx->buf_size)
+    dump_grow_buffer (ctx);
+  memcpy ((char *)ctx->buf + ctx->offset, buf, nbyte);
   ctx->offset += nbyte;
 }
 
@@ -844,10 +856,9 @@ dump_tailq_pop (struct dump_tailq *tailq)
 static void
 dump_seek (struct dump_context *ctx, dump_off offset)
 {
+  if (ctx->max_offset < ctx->offset)
+    ctx->max_offset = ctx->offset;
   eassert (ctx->obj_offset == 0);
-  if (lseek (ctx->fd, offset, SEEK_SET) < 0)
-    report_file_error ("Setting file position",
-                       ctx->dump_filename);
   ctx->offset = offset;
 }
 
@@ -4270,6 +4281,12 @@ types.  */)
   ctx->header.magic[0] = dump_magic[0];
   dump_seek (ctx, 0);
   dump_write (ctx, &ctx->header, sizeof (ctx->header));
+  if (emacs_write (ctx->fd, ctx->buf, ctx->max_offset) < ctx->max_offset)
+    report_file_error ("Could not write to dump file", ctx->dump_filename);
+  xfree (ctx->buf);
+  ctx->buf = NULL;
+  ctx->buf_size = 0;
+  ctx->max_offset = 0;
 
   dump_off
     header_bytes = header_end - header_start,
diff --git a/src/process.c b/src/process.c
index 84e301a..c354f3a 100644
--- a/src/process.c
+++ b/src/process.c
@@ -473,8 +473,15 @@ add_read_fd (int fd, fd_callback func, void *data)
   fd_callback_info[fd].data = data;
 }
 
+void
+add_non_keyboard_read_fd (int fd, fd_callback func, void *data)
+{
+  add_read_fd(fd, func, data);
+  fd_callback_info[fd].flags &= ~KEYBOARD_FD;
+}
+
 static void
-add_non_keyboard_read_fd (int fd)
+add_process_read_fd (int fd)
 {
   eassert (fd >= 0 && fd < FD_SETSIZE);
   eassert (fd_callback_info[fd].func == NULL);
@@ -483,12 +490,6 @@ add_non_keyboard_read_fd (int fd)
   fd_callback_info[fd].flags |= FOR_READ;
   if (fd > max_desc)
     max_desc = fd;
-}
-
-static void
-add_process_read_fd (int fd)
-{
-  add_non_keyboard_read_fd (fd);
   eassert (0 <= fd && fd < FD_SETSIZE);
   fd_callback_info[fd].flags |= PROCESS_FD;
 }
@@ -5133,6 +5134,7 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
                             Lisp_Object wait_for_cell,
                             struct Lisp_Process *wait_proc, int just_wait_proc)
 {
+  static int last_read_channel = -1;
   int channel, nfds;
   fd_set Available;
   fd_set Writeok;
@@ -5187,6 +5189,8 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
   while (1)
     {
       bool process_skipped = false;
+      bool wrapped;
+      int channel_start;
 
       /* If calling from keyboard input, do not quit
         since we want to return C-g as an input character.
@@ -5721,8 +5725,21 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
             d->func (channel, d->data);
        }
 
-      for (channel = 0; channel <= max_desc; channel++)
+      /* Do round robin if `process-pritoritize-lower-fds' is nil. */
+      channel_start
+       = process_prioritize_lower_fds ? 0 : last_read_channel + 1;
+
+      for (channel = channel_start, wrapped = false;
+          !wrapped || (channel < channel_start && channel <= max_desc);
+          channel++)
        {
+         if (channel > max_desc)
+           {
+             wrapped = true;
+             channel = -1;
+             continue;
+           }
+
          if (FD_ISSET (channel, &Available)
              && ((fd_callback_info[channel].flags & (KEYBOARD_FD | PROCESS_FD))
                  == PROCESS_FD))
@@ -5760,6 +5777,7 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
                     don't try to read from any other processes
                     before doing the select again.  */
                  FD_ZERO (&Available);
+                 last_read_channel = channel;
 
                  if (do_display)
                    redisplay_preserve_echo_area (12);
@@ -8476,6 +8494,16 @@ non-nil value means that the delay is not reset on write.
 The variable takes effect when `start-process' is called.  */);
   Vprocess_adaptive_read_buffering = Qt;
 
+  DEFVAR_BOOL ("process-prioritize-lower-fds", process_prioritize_lower_fds,
+              doc: /* Whether to start checking for subprocess output from 
first file descriptor.
+Emacs loops through file descriptors to check for output from subprocesses.
+If this variable is nil, the default, then after accepting output from a
+subprocess, Emacs will continue checking the rest of descriptors, starting
+from the one following the descriptor it just read.  If this variable is
+non-nil, Emacs will always restart the loop from the first file descriptor,
+thus favoring processes with lower descriptors.  */);
+  process_prioritize_lower_fds = 0;
+
   DEFVAR_LISP ("interrupt-process-functions", Vinterrupt_process_functions,
               doc: /* List of functions to be called for `interrupt-process'.
 The arguments of the functions are the same as for `interrupt-process'.
diff --git a/src/process.h b/src/process.h
index d041ada..0890f25 100644
--- a/src/process.h
+++ b/src/process.h
@@ -284,6 +284,7 @@ extern bool kbd_on_hold_p (void);
 typedef void (*fd_callback) (int fd, void *data);
 
 extern void add_read_fd (int fd, fd_callback func, void *data);
+extern void add_non_keyboard_read_fd (int fd, fd_callback func, void *data);
 extern void delete_read_fd (int fd);
 extern void add_write_fd (int fd, fd_callback func, void *data);
 extern void delete_write_fd (int fd);
diff --git a/src/search.c b/src/search.c
index c757bf3..df384e1 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2723,7 +2723,6 @@ since only regular expressions have distinguished 
subexpressions.  */)
     }
 
   newpoint = sub_start + SCHARS (newtext);
-  ptrdiff_t newstart = sub_start == sub_end ? newpoint : sub_start;
 
   /* Replace the old text with the new in the cleanest possible way.  */
   replace_range (sub_start, sub_end, newtext, 1, 0, 1, true);
@@ -2739,11 +2738,11 @@ since only regular expressions have distinguished 
subexpressions.  */)
   /* The replace_range etc. functions can trigger modification hooks
      (see signal_before_change and signal_after_change).  Try to error
      out if these hooks clobber the match data since clobbering can
-     result in confusing bugs.  Although this sanity check does not
-     catch all possible clobberings, it should catch many of them.  */
-  if (! (search_regs.num_regs == num_regs
-        && search_regs.start[sub] == newstart
-        && search_regs.end[sub] == newpoint))
+     result in confusing bugs.  We used to check for changes in
+     search_regs start and end, but that fails if modification hooks
+     remove or add text earlier in the buffer, so just check num_regs
+     now. */
+  if (search_regs.num_regs != num_regs)
     error ("Match data clobbered by buffer modification hooks");
 
   /* Put point back where it was in the text, if possible.  */
diff --git a/src/syntax.c b/src/syntax.c
index 9fbf885..7bba336 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1109,6 +1109,23 @@ this is probably the wrong function to use, because it 
can't take
   return make_fixnum (syntax_code_spec[SYNTAX (char_int)]);
 }
 
+DEFUN ("syntax-class-to-char", Fsyntax_class_to_char,
+       Ssyntax_class_to_char, 1, 1, 0,
+       doc: /* Return the syntax char of CLASS, described by an integer.
+For example, if SYNTAX is word constituent (the integer 2), the
+character `w' (119) is returned.  */)
+  (Lisp_Object syntax)
+{
+  int syn;
+  CHECK_FIXNUM (syntax);
+  syn = XFIXNUM (syntax);
+
+  if (syn < 0 || syn >= sizeof syntax_code_spec)
+    args_out_of_range (make_fixnum (sizeof syntax_code_spec - 1),
+                      syntax);
+  return make_fixnum (syntax_code_spec[syn]);
+}
+
 DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0,
        doc: /* Return the matching parenthesis of CHARACTER, or nil if none.  
*/)
   (Lisp_Object character)
@@ -3782,6 +3799,7 @@ In both cases, LIMIT bounds the search. */);
   defsubr (&Scopy_syntax_table);
   defsubr (&Sset_syntax_table);
   defsubr (&Schar_syntax);
+  defsubr (&Ssyntax_class_to_char);
   defsubr (&Smatching_paren);
   defsubr (&Sstring_to_syntax);
   defsubr (&Smodify_syntax_entry);
diff --git a/src/sysdep.c b/src/sysdep.c
index d940acc..51d8b5e 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -3626,7 +3626,7 @@ system_process_attributes (Lisp_Object pid)
   ttyname = proc.ki_tdev == NODEV ? NULL : devname (proc.ki_tdev, S_IFCHR);
   unblock_input ();
   if (ttyname)
-    attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs);
+    attrs = Fcons (Fcons (Qttname, build_string (ttyname)), attrs);
 
   attrs = Fcons (Fcons (Qtpgid,   INT_TO_INTEGER (proc.ki_tpgid)), attrs);
   attrs = Fcons (Fcons (Qminflt,  INT_TO_INTEGER (proc.ki_rusage.ru_minflt)),
@@ -3898,20 +3898,19 @@ system_process_attributes (Lisp_Object pid)
 Lisp_Object
 system_process_attributes (Lisp_Object pid)
 {
-  int proc_id;
+  int proc_id, i;
   struct passwd *pw;
   struct group  *gr;
   char *ttyname;
   struct timeval starttime;
   struct timespec t, now;
-  struct rusage *rusage;
   dev_t tdev;
   uid_t uid;
   gid_t gid;
 
   int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID};
   struct kinfo_proc proc;
-  size_t proclen = sizeof proc;
+  size_t len = sizeof proc;
 
   Lisp_Object attrs = Qnil;
   Lisp_Object decoded_comm;
@@ -3920,7 +3919,7 @@ system_process_attributes (Lisp_Object pid)
   CONS_TO_INTEGER (pid, int, proc_id);
   mib[3] = proc_id;
 
-  if (sysctl (mib, 4, &proc, &proclen, NULL, 0) != 0 || proclen == 0)
+  if (sysctl (mib, 4, &proc, &len, NULL, 0) != 0 || len == 0)
     return attrs;
 
   uid = proc.kp_eproc.e_ucred.cr_uid;
@@ -3957,8 +3956,8 @@ system_process_attributes (Lisp_Object pid)
   decoded_comm = (code_convert_string_norecord
                  (build_unibyte_string (comm),
                   Vlocale_coding_system, 0));
-
   attrs = Fcons (Fcons (Qcomm, decoded_comm), attrs);
+
   {
     char state[2] = {'\0', '\0'};
     switch (proc.kp_proc.p_stat)
@@ -3994,27 +3993,24 @@ system_process_attributes (Lisp_Object pid)
   ttyname = tdev == NODEV ? NULL : devname (tdev, S_IFCHR);
   unblock_input ();
   if (ttyname)
-    attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs);
+    attrs = Fcons (Fcons (Qttname, build_string (ttyname)), attrs);
 
   attrs = Fcons (Fcons (Qtpgid, INT_TO_INTEGER (proc.kp_eproc.e_tpgid)),
                 attrs);
 
-  rusage = proc.kp_proc.p_ru;
-  if (rusage)
+  rusage_info_current ri;
+  if (proc_pid_rusage(proc_id, RUSAGE_INFO_CURRENT, (rusage_info_t *) &ri) == 
0)
     {
-      attrs = Fcons (Fcons (Qminflt, INT_TO_INTEGER (rusage->ru_minflt)),
-                    attrs);
-      attrs = Fcons (Fcons (Qmajflt, INT_TO_INTEGER (rusage->ru_majflt)),
-                    attrs);
-
-      attrs = Fcons (Fcons (Qutime, make_lisp_timeval (rusage->ru_utime)),
-                    attrs);
-      attrs = Fcons (Fcons (Qstime, make_lisp_timeval (rusage->ru_stime)),
-                    attrs);
-      t = timespec_add (timeval_to_timespec (rusage->ru_utime),
-                       timeval_to_timespec (rusage->ru_stime));
-      attrs = Fcons (Fcons (Qtime, make_lisp_time (t)), attrs);
-    }
+      struct timespec utime = make_timespec (ri.ri_user_time / TIMESPEC_HZ,
+                                            ri.ri_user_time % TIMESPEC_HZ);
+      struct timespec stime = make_timespec (ri.ri_system_time / TIMESPEC_HZ,
+                                            ri.ri_system_time % TIMESPEC_HZ);
+      attrs = Fcons (Fcons (Qutime, make_lisp_time (utime)), attrs);
+      attrs = Fcons (Fcons (Qstime, make_lisp_time (stime)), attrs);
+      attrs = Fcons (Fcons (Qtime, make_lisp_time (timespec_add (utime, 
stime))), attrs);
+
+      attrs = Fcons (Fcons (Qmajflt, INT_TO_INTEGER (ri.ri_pageins)), attrs);
+  }
 
   starttime = proc.kp_proc.p_starttime;
   attrs = Fcons (Fcons (Qnice,  make_fixnum (proc.kp_proc.p_nice)), attrs);
@@ -4024,6 +4020,50 @@ system_process_attributes (Lisp_Object pid)
   t = timespec_sub (now, timeval_to_timespec (starttime));
   attrs = Fcons (Fcons (Qetime, make_lisp_time (t)), attrs);
 
+  struct proc_taskinfo taskinfo;
+  if (proc_pidinfo (proc_id, PROC_PIDTASKINFO, 0, &taskinfo, sizeof 
(taskinfo)) > 0)
+    {
+      attrs = Fcons (Fcons (Qvsize, make_fixnum (taskinfo.pti_virtual_size / 
1024)), attrs);
+      attrs = Fcons (Fcons (Qrss, make_fixnum (taskinfo.pti_resident_size / 
1024)), attrs);
+      attrs = Fcons (Fcons (Qthcount, make_fixnum (taskinfo.pti_threadnum)), 
attrs);
+    }
+
+#ifdef KERN_PROCARGS2
+  char args[ARG_MAX];
+  mib[1] = KERN_PROCARGS2;
+  mib[2] = proc_id;
+  len = sizeof args;
+
+  if (sysctl (mib, 3, &args, &len, NULL, 0) == 0 && len != 0)
+    {
+      char *start, *end;
+
+      int argc = *(int*)args; /* argc is the first int */
+      start = args + sizeof (int);
+
+      start += strlen (start) + 1; /* skip executable name and any '\0's */
+      while ((start - args < len) && ! *start) start++;
+
+      /* skip argv to find real end */
+      for (i = 0, end = start; i < argc && (end - args) < len; i++)
+       {
+         end += strlen (end) + 1;
+       }
+
+      len = end - start;
+      for (int i = 0; i < len; i++)
+       {
+         if (! start[i] && i < len - 1)
+           start[i] = ' ';
+       }
+
+      AUTO_STRING (comm, start);
+      decoded_comm = code_convert_string_norecord (comm,
+                                                  Vlocale_coding_system, 0);
+      attrs = Fcons (Fcons (Qargs, decoded_comm), attrs);
+    }
+#endif /* KERN_PROCARGS2 */
+
   return attrs;
 }
 
diff --git a/src/verbose.mk.in b/src/verbose.mk.in
index 085a05a..50d6ea3 100644
--- a/src/verbose.mk.in
+++ b/src/verbose.mk.in
@@ -38,7 +38,7 @@ ifeq ($(HAVE_NATIVE_COMP),yes)
 ifeq ($(NATIVE_DISABLED),1)
 AM_V_ELC = @echo "  ELC     " $@;
 else
-AM_V_ELC = @echo "  ELC+ELN     " $@;
+AM_V_ELC = @echo "  ELC+ELN " $@;
 endif
 else
 AM_V_ELC = @echo "  ELC     " $@;
diff --git a/src/w32.c b/src/w32.c
index 467e6cb..968b4bb 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -4747,7 +4747,7 @@ sys_rename_replace (const char *oldname, const char 
*newname, BOOL force)
   /* volume_info is set indirectly by map_w32_filename.  */
   oldname_dev = volume_info.serialnum;
 
-  if (os_subtype == OS_9X)
+  if (os_subtype == OS_SUBTYPE_9X)
     {
       char * o;
       char * p;
@@ -10468,7 +10468,7 @@ shutdown_handler (DWORD type)
 HANDLE
 maybe_load_unicows_dll (void)
 {
-  if (os_subtype == OS_9X)
+  if (os_subtype == OS_SUBTYPE_9X)
     {
       HANDLE ret = LoadLibrary ("Unicows.dll");
       if (ret)
@@ -10587,6 +10587,45 @@ w32_my_exename (void)
   return exename;
 }
 
+/* Emulate Posix 'realpath'.  This is needed in
+   comp-el-to-eln-rel-filename.  */
+char *
+realpath (const char *file_name, char *resolved_name)
+{
+  char *tgt = chase_symlinks (file_name);
+  char target[MAX_UTF8_PATH];
+
+  if (tgt == file_name)
+    {
+      /* If FILE_NAME is not a symlink, chase_symlinks returns its
+        argument, possibly not in canonical absolute form.  Make sure
+        we return a canonical file name.  */
+      if (w32_unicode_filenames)
+       {
+         wchar_t file_w[MAX_PATH], tgt_w[MAX_PATH];
+
+         filename_to_utf16 (file_name, file_w);
+         if (GetFullPathNameW (file_w, MAX_PATH, tgt_w, NULL) == 0)
+           return NULL;
+         filename_from_utf16 (tgt_w, target);
+       }
+      else
+       {
+         char file_a[MAX_PATH], tgt_a[MAX_PATH];
+
+         filename_to_ansi (file_name, file_a);
+         if (GetFullPathNameA (file_a, MAX_PATH, tgt_a, NULL) == 0)
+           return NULL;
+         filename_from_ansi (tgt_a, target);
+       }
+      tgt = target;
+    }
+
+  if (resolved_name)
+    return strcpy (resolved_name, tgt);
+  return xstrdup (tgt);
+}
+
 /*
        globals_of_w32 is used to initialize those global variables that
        must always be initialized on startup even when the global variable
diff --git a/src/w32.h b/src/w32.h
index a382dbe..ffa145b 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -187,6 +187,7 @@ extern DWORD multiByteToWideCharFlags;
 
 extern char *w32_my_exename (void);
 extern const char *w32_relocate (const char *);
+extern char *realpath (const char *, char *);
 
 extern void init_environment (char **);
 extern void check_windows_init_file (void);
diff --git a/src/w32common.h b/src/w32common.h
index cbe05c5..6493b9c 100644
--- a/src/w32common.h
+++ b/src/w32common.h
@@ -41,8 +41,8 @@ extern int                  w32_minor_version;
 extern int           w32_build_number;
 
 enum {
-  OS_9X = 1,
-  OS_NT
+  OS_SUBTYPE_9X = 1,
+  OS_SUBTYPE_NT
 };
 
 extern int os_subtype;
diff --git a/src/w32console.c b/src/w32console.c
index cb9e288..99546c2 100644
--- a/src/w32console.c
+++ b/src/w32console.c
@@ -803,7 +803,7 @@ initialize_w32_display (struct terminal *term, int *width, 
int *height)
       ceol_initialized = FALSE;
     }
 
-  if (os_subtype == OS_NT)
+  if (os_subtype == OS_SUBTYPE_NT)
     w32_console_unicode_input = 1;
   else
     w32_console_unicode_input = 0;
diff --git a/src/w32fns.c b/src/w32fns.c
index 66baeae..14d1154 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -6107,6 +6107,8 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
 
          if (!NILP (visibility))
            w32_make_frame_visible (f);
+         else
+           f->was_invisible = true;
        }
 
       store_frame_param (f, Qvisibility, visibility);
@@ -7991,7 +7993,7 @@ DEFUN ("system-move-file-to-trash", 
Fsystem_move_file_to_trash,
 
       /* The Unicode version of SHFileOperation is not supported on
         Windows 9X. */
-      if (w32_unicode_filenames && os_subtype != OS_9X)
+      if (w32_unicode_filenames && os_subtype != OS_SUBTYPE_9X)
        {
          SHFILEOPSTRUCTW file_op_w;
          /* We need one more element beyond MAX_PATH because this is
@@ -9120,7 +9122,7 @@ The coordinates X and Y are interpreted in pixels 
relative to a position
   /* When "mouse trails" are in effect, moving the mouse cursor
      sometimes leaves behind an annoying "ghost" of the pointer.
      Avoid that by momentarily switching off mouse trails.  */
-  if (os_subtype == OS_NT
+  if (os_subtype == OS_SUBTYPE_NT
       && w32_major_version + w32_minor_version >= 6)
     ret = SystemParametersInfo (SPI_GETMOUSETRAILS, 0, &trail_num, 0);
   SetCursorPos (xval, yval);
@@ -9295,7 +9297,7 @@ DEFUN ("default-printer-name", Fdefault_printer_name, 
Sdefault_printer_name,
   if (!OpenPrinter (pname_buf, &hPrn, NULL))
     return Qnil;
   /* GetPrinterW is not supported by unicows.dll.  */
-  if (w32_unicode_filenames && os_subtype != OS_9X)
+  if (w32_unicode_filenames && os_subtype != OS_SUBTYPE_9X)
     GetPrinterW (hPrn, 2, NULL, 0, &dwNeeded);
   else
     GetPrinterA (hPrn, 2, NULL, 0, &dwNeeded);
@@ -9305,7 +9307,7 @@ DEFUN ("default-printer-name", Fdefault_printer_name, 
Sdefault_printer_name,
       return Qnil;
     }
   /* Call GetPrinter again with big enough memory block.  */
-  if (w32_unicode_filenames && os_subtype != OS_9X)
+  if (w32_unicode_filenames && os_subtype != OS_SUBTYPE_9X)
     {
       /* Allocate memory for the PRINTER_INFO_2 struct.  */
       ppi2w = xmalloc (dwNeeded);
@@ -9441,9 +9443,9 @@ cache_system_info (void)
   w32_minor_version = version.info.minor;
 
   if (version.info.platform & 0x8000)
-    os_subtype = OS_9X;
+    os_subtype = OS_SUBTYPE_9X;
   else
-    os_subtype = OS_NT;
+    os_subtype = OS_SUBTYPE_NT;
 
   /* Cache page size, allocation unit, processor type, etc.  */
   GetSystemInfo (&sysinfo_cache);
@@ -9454,7 +9456,7 @@ cache_system_info (void)
   GetVersionEx (&osinfo_cache);
 
   w32_build_number = osinfo_cache.dwBuildNumber;
-  if (os_subtype == OS_9X)
+  if (os_subtype == OS_SUBTYPE_9X)
     w32_build_number &= 0xffff;
 
   w32_num_mouse_buttons = GetSystemMetrics (SM_CMOUSEBUTTONS);
@@ -9633,7 +9635,7 @@ w32_kbd_patch_key (KEY_EVENT_RECORD *event, int cpId)
 
   /* On NT, call ToUnicode instead and then convert to the current
      console input codepage.  */
-  if (os_subtype == OS_NT)
+  if (os_subtype == OS_SUBTYPE_NT)
     {
       WCHAR buf[128];
 
@@ -11047,7 +11049,7 @@ see `w32-ansi-code-page'.  */);
   w32_multibyte_code_page = _getmbcp ();
 #endif
 
-  if (os_subtype == OS_NT)
+  if (os_subtype == OS_SUBTYPE_NT)
     w32_unicode_gui = 1;
   else
     w32_unicode_gui = 0;
diff --git a/src/w32heap.c b/src/w32heap.c
index e002f72..0f228bf 100644
--- a/src/w32heap.c
+++ b/src/w32heap.c
@@ -269,7 +269,7 @@ init_heap (bool use_dynamic_heap)
        }
 #endif
 
-      if (os_subtype == OS_9X)
+      if (os_subtype == OS_SUBTYPE_9X)
         {
           the_malloc_fn = malloc_after_dump_9x;
           the_realloc_fn = realloc_after_dump_9x;
@@ -312,7 +312,7 @@ init_heap (bool use_dynamic_heap)
        }
       heap = s_pfn_Rtl_Create_Heap (0, data_region_base, 0, 0, NULL, &params);
 
-      if (os_subtype == OS_9X)
+      if (os_subtype == OS_SUBTYPE_9X)
         {
           fprintf (stderr, "Cannot dump Emacs on Windows 9X; exiting.\n");
           exit (-1);
diff --git a/src/w32notify.c b/src/w32notify.c
index b9e9063..889fd9f 100644
--- a/src/w32notify.c
+++ b/src/w32notify.c
@@ -566,7 +566,7 @@ generate notifications correctly, though.  */)
   CHECK_LIST (filter);
 
   /* The underlying features are available only since XP.  */
-  if (os_subtype == OS_9X
+  if (os_subtype == OS_SUBTYPE_9X
       || (w32_major_version == 5 && w32_minor_version < 1))
     {
       errno = ENOSYS;
diff --git a/src/w32proc.c b/src/w32proc.c
index ffa56e1..702ea12 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -623,7 +623,7 @@ init_timers (void)
      need to probe for its availability dynamically, and call it
      through a pointer.  */
   s_pfn_Get_Thread_Times = NULL; /* in case dumped Emacs comes with a value */
-  if (os_subtype != OS_9X)
+  if (os_subtype != OS_SUBTYPE_9X)
     s_pfn_Get_Thread_Times = (GetThreadTimes_Proc)
       get_proc_addr (GetModuleHandle ("kernel32.dll"), "GetThreadTimes");
 
@@ -2654,7 +2654,7 @@ find_child_console (HWND hwnd, LPARAM arg)
 
       GetClassName (hwnd, window_class, sizeof (window_class));
       if (strcmp (window_class,
-                 (os_subtype == OS_9X)
+                 (os_subtype == OS_SUBTYPE_9X)
                  ? "tty"
                  : "ConsoleWindowClass") == 0)
        {
@@ -2878,7 +2878,7 @@ sys_kill (pid_t pid, int sig)
       if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
        {
 #if 1
-         if (os_subtype == OS_9X)
+         if (os_subtype == OS_SUBTYPE_9X)
            {
 /*
    Another possibility is to try terminating the VDM out-right by
@@ -3793,7 +3793,7 @@ w32_compare_strings (const char *s1, const char *s2, char 
*locname,
 
   if (!g_b_init_compare_string_w)
     {
-      if (os_subtype == OS_9X)
+      if (os_subtype == OS_SUBTYPE_9X)
        {
          pCompareStringW = (CompareStringW_Proc)
             get_proc_addr (LoadLibrary ("Unicows.dll"),
diff --git a/src/w32select.c b/src/w32select.c
index 85f8e55..f19b85a 100644
--- a/src/w32select.c
+++ b/src/w32select.c
@@ -1207,7 +1207,7 @@ globals_of_w32select (void)
   QANSICP = coding_from_cp (ANSICP);
   QOEMCP = coding_from_cp (OEMCP);
 
-  if (os_subtype == OS_NT)
+  if (os_subtype == OS_SUBTYPE_NT)
     Vselection_coding_system = Qutf_16le_dos;
   else if (inhibit_window_system)
     Vselection_coding_system = QOEMCP;
diff --git a/src/w32term.c b/src/w32term.c
index 4f91029..ad4d1a3 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1916,7 +1916,7 @@ w32_draw_image_foreground (struct glyph_string *s)
              /* HALFTONE produces better results, especially when
                 scaling to a larger size, but Windows 9X doesn't
                 support HALFTONE.  */
-             if (os_subtype == OS_NT
+             if (os_subtype == OS_SUBTYPE_NT
                  && (pmode = SetStretchBltMode (s->hdc, HALFTONE)) != 0)
                SetBrushOrgEx (s->hdc, 0, 0, NULL);
              StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
@@ -1952,7 +1952,7 @@ w32_draw_image_foreground (struct glyph_string *s)
            {
              int pmode = 0;
              /* Windows 9X doesn't support HALFTONE.  */
-             if (os_subtype == OS_NT
+             if (os_subtype == OS_SUBTYPE_NT
                  && (pmode = SetStretchBltMode (s->hdc, HALFTONE)) != 0)
                SetBrushOrgEx (s->hdc, 0, 0, NULL);
              StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
@@ -6644,7 +6644,7 @@ frame_set_mouse_pixel_position (struct frame *f, int 
pix_x, int pix_y)
   /* When "mouse trails" are in effect, moving the mouse cursor
      sometimes leaves behind an annoying "ghost" of the pointer.
      Avoid that by momentarily switching off mouse trails.  */
-  if (os_subtype == OS_NT
+  if (os_subtype == OS_SUBTYPE_NT
       && w32_major_version + w32_minor_version >= 6)
     ret = SystemParametersInfo (SPI_GETMOUSETRAILS, 0, &trail_num, 0);
   SetCursorPos (pt.x, pt.y);
@@ -7638,7 +7638,7 @@ specified by `file-name-coding-system'.
 This variable is set to non-nil by default when Emacs runs on Windows
 systems of the NT family, including W2K, XP, Vista, Windows 7 and
 Windows 8.  It is set to nil on Windows 9X.  */);
-  if (os_subtype == OS_9X)
+  if (os_subtype == OS_SUBTYPE_9X)
     w32_unicode_filenames = 0;
   else
     w32_unicode_filenames = 1;
diff --git a/src/w32term.h b/src/w32term.h
index 7d351df..160be35 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -761,7 +761,7 @@ extern bool w32_image_rotations_p (void);
 extern void setup_w32_kbdhook (void);
 extern void remove_w32_kbdhook (void);
 extern int check_w32_winkey_state (int);
-#define w32_kbdhook_active (os_subtype != OS_9X)
+#define w32_kbdhook_active (os_subtype != OS_SUBTYPE_9X)
 #else
 #define w32_kbdhook_active 0
 #endif
diff --git a/src/window.c b/src/window.c
index 0a14eca..db324ef 100644
--- a/src/window.c
+++ b/src/window.c
@@ -468,6 +468,7 @@ Return WINDOW.  */)
   else
     {
       fset_selected_window (XFRAME (frame), window);
+      /* Don't clear FRAME's select_mini_window_flag here.  */
       return window;
     }
 }
@@ -517,6 +518,9 @@ select_window (Lisp_Object window, Lisp_Object norecord,
     /* Do not select a tooltip window (Bug#47207).  */
     error ("Cannot select a tooltip window");
 
+  /* We deinitely want to select WINDOW, not the mini-window.  */
+  f->select_mini_window_flag = false;
+
   /* Make the selected window's buffer current.  */
   Fset_buffer (w->contents);
 
@@ -3242,6 +3246,9 @@ window-start value is reasonable when this function is 
called.  */)
          if (EQ (selected_frame, w->frame))
            Fselect_window (window, Qnil);
          else
+           /* Do not clear f->select_mini_window_flag here.  If the
+              last selected window on F was an active minibuffer, we
+              want to return to it on a later Fselect_frame.  */
            fset_selected_window (f, window);
        }
     }
@@ -5141,37 +5148,23 @@ Signal an error when WINDOW is the only window on its 
frame.  */)
       adjust_frame_glyphs (f);
 
       if (!WINDOW_LIVE_P (FRAME_SELECTED_WINDOW (f)))
-       /* We deleted the frame's selected window.  */
+       /* We apparently deleted the frame's selected window; use the
+          frame's first window as substitute but don't record it yet.
+          `delete-window' may have something better up its sleeves.  */
        {
          /* Use the frame's first window as fallback ...  */
          Lisp_Object new_selected_window = Fframe_first_window (frame);
-         /* ... but preferably use its most recently used window.  */
-         Lisp_Object mru_window;
 
-         /* `get-mru-window' might fail for some reason so play it safe
-         - promote the first window _without recording it_ first.  */
          if (EQ (FRAME_SELECTED_WINDOW (f), selected_window))
            Fselect_window (new_selected_window, Qt);
          else
-           fset_selected_window (f, new_selected_window);
-
-         unblock_input ();
-
-         /* Now look whether `get-mru-window' gets us something.  */
-         mru_window = call1 (Qget_mru_window, frame);
-         if (WINDOW_LIVE_P (mru_window)
-             && EQ (XWINDOW (mru_window)->frame, frame))
-           new_selected_window = mru_window;
-
-         /* If all ended up well, we now promote the mru window.  */
-         if (EQ (FRAME_SELECTED_WINDOW (f), selected_window))
-           Fselect_window (new_selected_window, Qnil);
-         else
+           /* Do not clear f->select_mini_window_flag here.  If the
+              last selected window on F was an active minibuffer, we
+              want to return to it on a later Fselect_frame.  */
            fset_selected_window (f, new_selected_window);
        }
-      else
-       unblock_input ();
 
+      unblock_input ();
       FRAME_WINDOW_CHANGE (f) = true;
     }
   else
@@ -7264,8 +7257,8 @@ restore_window_configuration (Lisp_Object configuration)
 {
   if (CONSP (configuration))
     Fset_window_configuration (XCAR (configuration),
-                              XCAR (XCDR (configuration)),
-                              XCAR (XCDR (XCDR (configuration))));
+                              Fcar_safe (XCDR (configuration)),
+                              Fcar_safe (Fcdr_safe (XCDR (configuration))));
   else
     Fset_window_configuration (configuration, Qnil, Qnil);
 }
diff --git a/src/xdisp.c b/src/xdisp.c
index 23b4ba5..c30084c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10795,6 +10795,9 @@ include the height of both, if present, in the return 
value.  */)
          it.max_descent = max (it.max_descent, it.descent);
        }
     }
+  else
+    bidi_unshelve_cache (it2data, true);
+
   if (!NILP (x_limit))
     {
       /* Don't return more than X-LIMIT.  */
@@ -10838,6 +10841,47 @@ include the height of both, if present, in the return 
value.  */)
 
   return Fcons (make_fixnum (x - start_x), make_fixnum (y));
 }
+
+DEFUN ("display--line-is-continued-p", Fdisplay__line_is_continued_p,
+       Sdisplay__line_is_continued_p, 0, 0, 0,
+       doc: /* Return non-nil if the current screen line is continued on 
display.  */)
+  (void)
+{
+  struct buffer *oldb = current_buffer;
+  struct window *w = XWINDOW (selected_window);
+  enum move_it_result rc = MOVE_POS_MATCH_OR_ZV;
+
+  set_buffer_internal_1 (XBUFFER (w->contents));
+
+  if (PT < ZV)
+    {
+      struct text_pos startpos;
+      struct it it;
+      void *itdata;
+      /* Use a marker, since vertical-motion enters redisplay, which can
+        trigger fontifications, which in turn could modify buffer text.  */
+      Lisp_Object opoint = Fpoint_marker ();
+
+      /* Make sure to start from the beginning of the current screen
+        line, so that move_it_in_display_line_to counts pixels correctly.  */
+      Fvertical_motion (make_fixnum (0), selected_window, Qnil);
+      SET_TEXT_POS (startpos, PT, PT_BYTE);
+      itdata = bidi_shelve_cache ();
+      start_display (&it, w, startpos);
+      /* If lines are truncated, no line is continued.  */
+      if (it.line_wrap != TRUNCATE)
+       {
+         it.glyph_row = NULL;
+         rc = move_it_in_display_line_to (&it, ZV, -1, MOVE_TO_POS);
+       }
+      SET_PT_BOTH (marker_position (opoint), marker_byte_position (opoint));
+      bidi_unshelve_cache (itdata, false);
+    }
+  set_buffer_internal_1 (oldb);
+
+  return rc == MOVE_LINE_CONTINUED ? Qt : Qnil;
+}
+
 
 /***********************************************************************
                               Messages
@@ -22345,15 +22389,23 @@ extend_face_to_end_of_line (struct it *it)
       it->face_id = (it->glyph_row->ends_at_zv_p ?
                      default_face->id : face->id);
 
-      /* Display fill-column indicator if needed.  */
-      const int indicator_column = fill_column_indicator_column (it, 1);
-
       /* Make sure our idea of current_x is in sync with the glyphs
         actually in the glyph row.  They might differ because
         append_space_for_newline can insert one glyph without
         updating current_x.  */
       it->current_x = it->glyph_row->used[TEXT_AREA];
 
+      /* The above assignment causes the code below to use a
+        non-standard semantics of it->current_x: it is measured
+        relative to the beginning of the text-area, thus disregarding
+        the window's hscroll.  That is why we need to correct the
+        indicator column for the hscroll, otherwise the indicator
+        will not move together with the text as result of horizontal
+        scrolling.  */
+      const int indicator_column =
+       fill_column_indicator_column (it, 1) - it->first_visible_x;
+
+      /* Display fill-column indicator if needed.  */
       while (it->current_x <= it->last_visible_x)
        {
          if (it->current_x != indicator_column)
@@ -30249,7 +30301,7 @@ produce_glyphless_glyph (struct it *it, bool 
for_no_font, Lisp_Object acronym)
 
       /* +4 is for vertical bars of a box plus 1-pixel spaces at both side.  */
       width = max (metrics_upper.width, metrics_lower.width) + 4;
-      upper_xoff = upper_yoff = 2; /* the typical case */
+      upper_xoff = lower_xoff = 2; /* the typical case */
       if (base_width >= width)
        {
          /* Align the upper to the left, the lower to the right.  */
@@ -30263,13 +30315,7 @@ produce_glyphless_glyph (struct it *it, bool 
for_no_font, Lisp_Object acronym)
          if (metrics_upper.width >= metrics_lower.width)
            lower_xoff = (width - metrics_lower.width) / 2;
          else
-           {
-             /* FIXME: This code doesn't look right.  It formerly was
-                missing the "lower_xoff = 0;", which couldn't have
-                been right since it left lower_xoff uninitialized.  */
-             lower_xoff = 0;
-             upper_xoff = (width - metrics_upper.width) / 2;
-           }
+           upper_xoff = (width - metrics_upper.width) / 2;
        }
 
       /* +5 is for horizontal bars of a box plus 1-pixel spaces at
@@ -34334,7 +34380,7 @@ gui_draw_bottom_divider (struct window *w)
                  && !NILP (XWINDOW (p->parent)->next))))
        x1 -= WINDOW_RIGHT_DIVIDER_WIDTH (w);
 
-       FRAME_RIF (f)->draw_window_divider (w, x0, x1, y0, y1);
+      FRAME_RIF (f)->draw_window_divider (w, x0, x1, y0, y1);
     }
 }
 
@@ -34739,6 +34785,7 @@ be let-bound around code that needs to disable messages 
temporarily. */);
   defsubr (&Swindow_text_pixel_size);
   defsubr (&Smove_point_visually);
   defsubr (&Sbidi_find_overridden_directionality);
+  defsubr (&Sdisplay__line_is_continued_p);
 
   DEFSYM (Qmenu_bar_update_hook, "menu-bar-update-hook");
   DEFSYM (Qoverriding_terminal_local_map, "overriding-terminal-local-map");
@@ -35603,8 +35650,10 @@ as usual.  If the function returns a string, the 
returned string is
 displayed in the echo area.  If this function returns any other non-nil
 value, this means that the message was already handled, and the original
 message text will not be displayed in the echo area.
-See also `clear-message-function' that can be used to clear the
-message displayed by this function.  */);
+
+Also see `clear-message-function' (which can be used to clear the
+message displayed by this function), and `command-error-function'
+(which controls how error messages are displayed).  */);
   Vset_message_function = Qnil;
 
   DEFVAR_LISP ("clear-message-function", Vclear_message_function,
diff --git a/src/xfaces.c b/src/xfaces.c
index ab4440f..fed7b333 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -353,10 +353,13 @@ static bool menu_face_changed_default;
 
 struct named_merge_point;
 
-static struct face *realize_face (struct face_cache *, Lisp_Object *,
+static struct face *realize_face (struct face_cache *,
+                                 Lisp_Object [LFACE_VECTOR_SIZE],
                                  int);
-static struct face *realize_gui_face (struct face_cache *, Lisp_Object *);
-static struct face *realize_tty_face (struct face_cache *, Lisp_Object *);
+static struct face *realize_gui_face (struct face_cache *,
+                                     Lisp_Object [LFACE_VECTOR_SIZE]);
+static struct face *realize_tty_face (struct face_cache *,
+                                     Lisp_Object [LFACE_VECTOR_SIZE]);
 static bool realize_basic_faces (struct frame *);
 static bool realize_default_face (struct frame *);
 static void realize_named_face (struct frame *, Lisp_Object, int);
diff --git a/src/xfns.c b/src/xfns.c
index 2c95065..e46616e 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1608,13 +1608,15 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object 
value, Lisp_Object oldval)
 
 /* Set the number of lines used for the tab bar of frame F to VALUE.
    VALUE not an integer, or < 0 means set the lines to zero.  OLDVAL
-   is the old number of tab bar lines.  This function changes the
+   is the old number of tab bar lines.  This function may change the
    height of all windows on frame F to match the new tab bar height.
-   The frame's height doesn't change.  */
+   The frame's height may change if frame_inhibit_implied_resize was
+   set accordingly.  */
 
 static void
 x_set_tab_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
 {
+  int olines = FRAME_TAB_BAR_LINES (f);
   int nlines;
 
   /* Treat tab bars like menu bars.  */
@@ -1627,7 +1629,8 @@ x_set_tab_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
   else
     nlines = 0;
 
-  x_change_tab_bar_height (f, nlines * FRAME_LINE_HEIGHT (f));
+  if (nlines != olines && (olines == 0 || nlines == 0))
+    x_change_tab_bar_height (f, nlines * FRAME_LINE_HEIGHT (f));
 }
 
 
@@ -4124,12 +4127,21 @@ This function is an internal primitive--use 
`make-frame' instead.  */)
      cannot control visibility, so don't try.  */
   if (!f->output_data.x->explicit_parent)
     {
+      /* When called from `x-create-frame-with-faces' visibility is
+        always explicitly nil.  */
       Lisp_Object visibility
        = gui_display_get_arg (dpyinfo, parms, Qvisibility, 0, 0,
                                RES_TYPE_SYMBOL);
+      Lisp_Object height
+       = gui_display_get_arg (dpyinfo, parms, Qheight, 0, 0, RES_TYPE_NUMBER);
+      Lisp_Object width
+       = gui_display_get_arg (dpyinfo, parms, Qwidth, 0, 0, RES_TYPE_NUMBER);
 
       if (EQ (visibility, Qicon))
-       x_iconify_frame (f);
+       {
+         f->was_invisible = true;
+         x_iconify_frame (f);
+       }
       else
        {
          if (EQ (visibility, Qunbound))
@@ -4137,8 +4149,17 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
 
          if (!NILP (visibility))
            x_make_frame_visible (f);
+         else
+           f->was_invisible = true;
        }
 
+      /* Leave f->was_invisible true only if height or width were
+        specified too.  This takes effect only when we are not called
+        from `x-create-frame-with-faces' (see above comment).  */
+      f->was_invisible
+       = (f->was_invisible
+          && (!EQ (height, Qunbound) || !EQ (width, Qunbound)));
+
       store_frame_param (f, Qvisibility, visibility);
     }
 
diff --git a/src/xgselect.c b/src/xgselect.c
index 0d91d55..92b118b 100644
--- a/src/xgselect.c
+++ b/src/xgselect.c
@@ -34,12 +34,27 @@ static GMainContext *glib_main_context;
 
 void release_select_lock (void)
 {
+#if GNUC_PREREQ (4, 7, 0)
+  if (__atomic_sub_fetch (&threads_holding_glib_lock, 1, __ATOMIC_ACQ_REL) == 
0)
+    g_main_context_release (glib_main_context);
+#else
   if (--threads_holding_glib_lock == 0)
     g_main_context_release (glib_main_context);
+#endif
 }
 
 static void acquire_select_lock (GMainContext *context)
 {
+#if GNUC_PREREQ (4, 7, 0)
+  if (__atomic_fetch_add (&threads_holding_glib_lock, 1, __ATOMIC_ACQ_REL) == 
0)
+    {
+      glib_main_context = context;
+      while (!g_main_context_acquire (context))
+       {
+         /* Spin. */
+       }
+    }
+#else
   if (threads_holding_glib_lock++ == 0)
     {
       glib_main_context = context;
@@ -48,6 +63,7 @@ static void acquire_select_lock (GMainContext *context)
          /* Spin. */
        }
     }
+#endif
 }
 
 /* `xg_select' is a `pselect' replacement.  Why do we need a separate function?
diff --git a/src/xsmfns.c b/src/xsmfns.c
index 10565a4..ddb86d8 100644
--- a/src/xsmfns.c
+++ b/src/xsmfns.c
@@ -357,7 +357,7 @@ ice_conn_watch_CB (IceConn iceConn, IcePointer clientData,
     }
 
   ice_fd = IceConnectionNumber (iceConn);
-  add_read_fd (ice_fd, x_session_check_input, NULL);
+  add_non_keyboard_read_fd (ice_fd, x_session_check_input, NULL);
 }
 
 /* Create the client leader window.  */
diff --git a/src/xterm.c b/src/xterm.c
index 5049f72..1887c32 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -8178,6 +8178,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              f->output_data.x->has_been_visible = true;
              inev.ie.kind = DEICONIFY_EVENT;
+#if defined USE_GTK && defined HAVE_GTK3
+             /* If GTK3 wants to impose some old size here (Bug#24526),
+                tell it that the current size is what we want.  */
+             if (f->was_invisible)
+               {
+                 xg_frame_set_char_size
+                   (f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
+                 f->was_invisible = false;
+               }
+#endif
              XSETFRAME (inev.ie.frame_or_window, f);
            }
          else if (!not_hidden && !FRAME_ICONIFIED_P (f))
@@ -8232,33 +8242,36 @@ handle_one_xevent (struct x_display_info *dpyinfo,
           if (!FRAME_VISIBLE_P (f))
             {
               block_input ();
-              SET_FRAME_VISIBLE (f, 1);
-              SET_FRAME_ICONIFIED (f, false);
-              if (FRAME_X_DOUBLE_BUFFERED_P (f))
+             /* The following two are commented out to avoid that a
+                plain invisible frame gets reported as iconified.  That
+                problem occurred first for Emacs 26 and is described in
+                
https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.  */
+/**          SET_FRAME_VISIBLE (f, 1); **/
+/**          SET_FRAME_ICONIFIED (f, false); **/
+
+             if (FRAME_X_DOUBLE_BUFFERED_P (f))
                 font_drop_xrender_surfaces (f);
               f->output_data.x->has_been_visible = true;
               SET_FRAME_GARBAGED (f);
               unblock_input ();
             }
           else if (FRAME_GARBAGED_P (f))
-            {
+           {
 #ifdef USE_GTK
-              /* Go around the back buffer and manually clear the
-                 window the first time we show it.  This way, we avoid
-                 showing users the sanity-defying horror of whatever
-                 GtkWindow is rendering beneath us.  We've garbaged
-                 the frame, so we'll redraw the whole thing on next
-                 redisplay anyway.  Yuck.  */
-              x_clear_area1 (
-                FRAME_X_DISPLAY (f),
-                FRAME_X_WINDOW (f),
-                event->xexpose.x, event->xexpose.y,
-                event->xexpose.width, event->xexpose.height,
-                0);
+             /* Go around the back buffer and manually clear the
+                window the first time we show it.  This way, we avoid
+                showing users the sanity-defying horror of whatever
+                GtkWindow is rendering beneath us.  We've garbaged
+                the frame, so we'll redraw the whole thing on next
+                redisplay anyway.  Yuck.  */
+             x_clear_area1 (FRAME_X_DISPLAY (f),
+                            FRAME_X_WINDOW (f),
+                            event->xexpose.x, event->xexpose.y,
+                            event->xexpose.width, event->xexpose.height,
+                            0);
              x_clear_under_internal_border (f);
 #endif
-            }
-
+           }
 
           if (!FRAME_GARBAGED_P (f))
             {
@@ -8351,7 +8364,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                            the frame was deleted.  */
         {
          bool visible = FRAME_VISIBLE_P (f);
-          /* While a frame is unmapped, display generation is
+
+         /* While a frame is unmapped, display generation is
              disabled; you don't want to spend time updating a
              display that won't ever be seen.  */
           SET_FRAME_VISIBLE (f, 0);
@@ -8426,11 +8440,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                x_set_z_group (f, Qbelow, Qnil);
            }
 
-          SET_FRAME_VISIBLE (f, 1);
-          SET_FRAME_ICONIFIED (f, false);
-          f->output_data.x->has_been_visible = true;
+         if (not_hidden)
+           {
+             SET_FRAME_VISIBLE (f, 1);
+             SET_FRAME_ICONIFIED (f, false);
+#if defined USE_GTK && defined HAVE_GTK3
+             /* If GTK3 wants to impose some old size here (Bug#24526),
+                tell it that the current size is what we want.  */
+             if (f->was_invisible)
+               {
+                 xg_frame_set_char_size
+                   (f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
+                 f->was_invisible = false;
+               }
+#endif
+             f->output_data.x->has_been_visible = true;
+           }
 
-          if (iconified)
+          if (not_hidden && iconified)
             {
               inev.ie.kind = DEICONIFY_EVENT;
               XSETFRAME (inev.ie.frame_or_window, f);
@@ -8808,10 +8835,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
       goto OTHER;
 
     case FocusIn:
+#ifndef USE_GTK
       /* Some WMs (e.g. Mutter in Gnome Shell), don't unmap
          minimized/iconified windows; thus, for those WMs we won't get
          a MapNotify when unminimizing/deconifying.  Check here if we
-         are deconizing a window (Bug42655). */
+         are deiconizing a window (Bug42655).
+
+        But don't do that on GTK since it may cause a plain invisible
+        frame get reported as iconified, compare
+        https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.
+        That is fixed above but bites us here again.  */
       f = any;
       if (f && FRAME_ICONIFIED_P (f))
        {
@@ -8821,6 +8854,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
           inev.ie.kind = DEICONIFY_EVENT;
           XSETFRAME (inev.ie.frame_or_window, f);
         }
+#endif /* USE_GTK */
 
       x_detect_focus_change (dpyinfo, any, event, &inev.ie);
       goto OTHER;
@@ -9071,8 +9105,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              to check the pixel dimensions as well.  */
           if (width != FRAME_PIXEL_WIDTH (f)
               || height != FRAME_PIXEL_HEIGHT (f)
-             || (delayed_size_change
-                 && (width != f->new_width || height != f->new_height)))
+             || (f->new_size_p
+                 && ((f->new_width >= 0 && width != f->new_width)
+                     || (f->new_height >= 0 && height != f->new_height))))
             {
               change_frame_size (f, width, height, false, true, false);
               x_clear_under_internal_border (f);
@@ -9308,6 +9343,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
       goto OTHER;
 
     case VisibilityNotify:
+      f = x_top_window_to_frame (dpyinfo, event->xvisibility.window);
+      if (f && (event->xvisibility.state == VisibilityUnobscured
+               || event->xvisibility.state == VisibilityPartiallyObscured))
+       SET_FRAME_VISIBLE (f, 1);
+
       goto OTHER;
 
     case MappingNotify:
@@ -9564,11 +9604,12 @@ x_draw_hollow_cursor (struct window *w, struct 
glyph_row *row)
   /* The foreground of cursor_gc is typically the same as the normal
      background color, which can cause the cursor box to be invisible.  */
   xgcv.foreground = f->output_data.x->cursor_pixel;
+  xgcv.line_width = 1;
   if (dpyinfo->scratch_cursor_gc)
-    XChangeGC (dpy, dpyinfo->scratch_cursor_gc, GCForeground, &xgcv);
+    XChangeGC (dpy, dpyinfo->scratch_cursor_gc, GCForeground | GCLineWidth, 
&xgcv);
   else
     dpyinfo->scratch_cursor_gc = XCreateGC (dpy, FRAME_X_DRAWABLE (f),
-                                           GCForeground, &xgcv);
+                                           GCForeground | GCLineWidth, &xgcv);
   gc = dpyinfo->scratch_cursor_gc;
 
   /* When on R2L character, show cursor at the right edge of the
@@ -11822,12 +11863,14 @@ x_make_frame_visible (struct frame *f)
     poll_suppress_count = old_poll_suppress_count;
 #endif
 
-    if (CONSP (frame_size_history))
-      frame_size_history_plain
-       (f, build_string ("x_make_frame_visible"));
+    if (!FRAME_VISIBLE_P (f))
+      {
+       if (CONSP (frame_size_history))
+         frame_size_history_plain
+           (f, build_string ("x_make_frame_visible"));
 
-    if (! FRAME_VISIBLE_P (f))
-      x_wait_for_event (f, MapNotify);
+       x_wait_for_event (f, MapNotify);
+      }
   }
 }
 
diff --git a/test/Makefile.in b/test/Makefile.in
index 84ab4e7..c1518d3 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -245,13 +245,13 @@ endef
 $(foreach test,${TESTS},$(eval $(call test_template,${test})))
 
 ## Get the tests for only a specific directory.
-SUBDIRS = $(sort $(shell find lib-src lisp misc src -type d ! -path 
"*resources*" -print))
+SUBDIRS = $(sort $(shell cd ${srcdir} && find lib-src lisp misc src -type d ! 
-path "*resources*" -print))
 
 define subdir_template
   .PHONY: check-$(subst /,-,$(1))
   check-$(subst /,-,$(1)):
        @${MAKE} check LOGFILES="$(patsubst %.el,%.log, \
-               $(patsubst $(srcdir)/%,%,$(wildcard $(1)/*.el)))"
+               $(patsubst $(srcdir)/%,%,$(wildcard ${srcdir}/$(1)/*.el)))"
 endef
 
 $(foreach subdir, $(SUBDIRS), $(eval $(call subdir_template,$(subdir))))
@@ -340,6 +340,7 @@ mostlyclean:
 
 clean:
        find . '(' -name '*.log' -o -name '*.log~' ')' $(FIND_DELETE)
+       rm -f ${srcdir}/lisp/gnus/mml-sec-resources/random_seed
        rm -f $(test_module_dir)/*.o $(test_module_dir)/*.so \
          $(test_module_dir)/*.dll
 
diff --git a/test/README b/test/README
index a348074..97611cf 100644
--- a/test/README
+++ b/test/README
@@ -7,6 +7,9 @@ Emacs's functionality.  Please help add tests!
 See the file file-organization.org for the details of the directory
 structure and file-naming conventions.
 
+For tests in the manual/ subdirectory, look there for separate README
+files, or look for instructions in the test files themselves.
+
 Emacs uses ERT, Emacs Lisp Regression Testing, for testing.  See (info
 "(ert)") or https://www.gnu.org/software/emacs/manual/html_node/ert/
 for more information on writing and running tests.
@@ -102,6 +105,11 @@ debugging.  To do that, use
 
     make TEST_INTERACTIVE=yes ...
 
+By default, ERT test failure summaries are quite brief in batch
+mode--only the names of the failed tests are listed.  If the
+$EMACS_TEST_VERBOSE environment variable is set, the failure summaries
+will also include the data from the failing test.
+
 Some of the tests require a remote temporary directory
 (autorevert-tests.el, filenotify-tests.el, shadowfile-tests.el and
 tramp-tests.el).  Per default, a mock-up connection method is used
diff --git a/test/infra/Dockerfile.emba b/test/infra/Dockerfile.emba
index 19c83a8..9f03482 100644
--- a/test/infra/Dockerfile.emba
+++ b/test/infra/Dockerfile.emba
@@ -70,3 +70,18 @@ RUN ./autogen.sh autoconf
 RUN ./configure --with-ns
 RUN make bootstrap
 RUN make -j4
+
+FROM emacs-base as emacs-native-comp-speed0
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends -o=Dpkg::Use-Pty=0 
libgccjit-6-dev \
+    && rm -rf /var/lib/apt/lists/*
+
+ARG make_bootstrap_params=""
+
+COPY . /checkout
+WORKDIR /checkout
+RUN ./autogen.sh autoconf
+RUN ./configure --with-nativecomp
+RUN make bootstrap -j2 NATIVE_FULL_AOT=1 BYTE_COMPILE_EXTRA_FLAGS='--eval 
"(setq comp-speed 0)"'
+RUN make -j4
diff --git a/test/infra/gitlab-ci.yml b/test/infra/gitlab-ci.yml
index 4023437..6876a8b 100644
--- a/test/infra/gitlab-ci.yml
+++ b/test/infra/gitlab-ci.yml
@@ -44,6 +44,7 @@ workflow:
 variables:
   GIT_STRATEGY: fetch
   EMACS_EMBA_CI: 1
+  EMACS_TEST_VERBOSE: 1
   # # Use TLS 
https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
   # DOCKER_HOST: tcp://docker:2376
   # DOCKER_TLS_CERTDIR: "/certs"
@@ -181,6 +182,21 @@ default:
         - test/lisp/autorevert-tests.el
         - test/lisp/filenotify-tests.el
 
+.native-comp-template:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "web"'
+    - if: '$CI_PIPELINE_SOURCE == "schedule"'
+      changes:
+        - "**/Makefile.in"
+        - .gitlab-ci.yml
+        - lisp/emacs-lisp/comp.el
+        - lisp/emacs-lisp/comp-cstr.el
+        - src/comp.{h,m}
+        - test/infra/*
+        - test/src/comp-resources/*.el
+        - test/src/comp-tests.el
+  timeout: 8 hours
+
 stages:
   - prep-images
   - build-images
@@ -188,6 +204,8 @@ stages:
   - normal
   - platform-images
   - platforms
+  - native-comp-images
+  - native-comp
   - slow
 
 prep-image-base:
@@ -199,6 +217,7 @@ prep-image-base:
 build-image-inotify:
   stage: build-images
   extends: [.job-template, .build-template]
+  needs: [prep-image-base]
   variables:
     target: emacs-inotify
 
@@ -209,18 +228,6 @@ test-fast-inotify:
     target: emacs-inotify
     make_params: "-C test check"
 
-build-image-filenotify-gio:
-  stage: platform-images
-  extends: [.job-template, .build-template, .filenotify-gio-template]
-  variables:
-    target: emacs-filenotify-gio
-
-build-image-gnustep:
-  stage: platform-images
-  extends: [.job-template, .build-template, .gnustep-template]
-  variables:
-    target: emacs-gnustep
-
 test-lisp-inotify:
   stage: normal
   extends: [.job-template, .test-template]
@@ -235,6 +242,20 @@ test-lisp-net-inotify:
     target: emacs-inotify
     make_params: "-C test check-lisp-net"
 
+build-image-filenotify-gio:
+  stage: platform-images
+  extends: [.job-template, .build-template, .filenotify-gio-template]
+  needs: [prep-image-base]
+  variables:
+    target: emacs-filenotify-gio
+
+build-image-gnustep:
+  stage: platform-images
+  extends: [.job-template, .build-template, .gnustep-template]
+  needs: [prep-image-base]
+  variables:
+    target: emacs-gnustep
+
 test-filenotify-gio:
   # This tests file monitor libraries gfilemonitor and gio.
   stage: platforms
@@ -244,38 +265,6 @@ test-filenotify-gio:
     target: emacs-filenotify-gio
     make_params: "-k -C test autorevert-tests.log filenotify-tests.log"
 
-build-native-bootstrap-speed0:
-  # Test a full native bootstrap
-  # Run for now only speed 0 to limit memory usage and compilation time.
-  stage: slow
-  # Uncomment the following to run it only when scheduled.
-  # only:
-  #   - schedules
-  script:
-    - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
-    - ./autogen.sh autoconf
-    - ./configure --with-nativecomp
-    - make bootstrap NATIVE_FULL_AOT=1 BYTE_COMPILE_EXTRA_FLAGS='--eval "(setq 
comp-speed 0)"' -j2
-  timeout: 8 hours
-
-build-native-bootstrap-speed1:
-  stage: slow
-  script:
-    - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
-    - ./autogen.sh autoconf
-    - ./configure --with-nativecomp
-    - make bootstrap BYTE_COMPILE_EXTRA_FLAGS='--eval "(setq comp-speed 1)"'
-  timeout: 8 hours
-
-build-native-bootstrap-speed2:
-  stage: slow
-  script:
-    - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
-    - ./autogen.sh autoconf
-    - ./configure --with-nativecomp
-    - make bootstrap
-  timeout: 8 hours
-
 test-gnustep:
   # This tests the GNUstep build process
   stage: platforms
@@ -285,6 +274,45 @@ test-gnustep:
     target: emacs-gnustep
     make_params: install
 
+build-native-bootstrap-speed0:
+  stage: native-comp-images
+  extends: [.job-template, .build-template, .native-comp-template]
+  needs: [prep-image-base]
+  variables:
+    target: emacs-native-comp-speed0
+
+# build-native-bootstrap-speed0:
+#   # Test a full native bootstrap
+#   # Run for now only speed 0 to limit memory usage and compilation time.
+#   stage: native-comp-images
+#   # Uncomment the following to run it only when scheduled.
+#   # only:
+#   #   - schedules
+#   script:
+#     - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
+#     - ./autogen.sh autoconf
+#     - ./configure --with-nativecomp
+#     - make bootstrap NATIVE_FULL_AOT=1 BYTE_COMPILE_EXTRA_FLAGS='--eval 
"(setq comp-speed 0)"' -j2
+#   timeout: 8 hours
+
+# build-native-bootstrap-speed1:
+#   stage: native-comp-images
+#   script:
+#     - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
+#     - ./autogen.sh autoconf
+#     - ./configure --with-nativecomp
+#     - make bootstrap BYTE_COMPILE_EXTRA_FLAGS='--eval "(setq comp-speed 1)"'
+#   timeout: 8 hours
+
+# build-native-bootstrap-speed2:
+#   stage: native-comp-images
+#   script:
+#     - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y 
-qq -o=Dpkg::Use-Pty=0 libgccjit-6-dev
+#     - ./autogen.sh autoconf
+#     - ./configure --with-nativecomp
+#     - make bootstrap
+#   timeout: 8 hours
+
 test-all-inotify:
   # This tests also file monitor libraries inotify and inotifywatch.
   stage: slow
diff --git a/test/lisp/auth-source-pass-tests.el 
b/test/lisp/auth-source-pass-tests.el
index bfbef53..d050ac5 100644
--- a/test/lisp/auth-source-pass-tests.el
+++ b/test/lisp/auth-source-pass-tests.el
@@ -49,6 +49,12 @@
                    '(("key1" . "val1")
                      ("key2" . "val2"))))))
 
+(ert-deftest auth-source-pass-parse-with-colons-in-data ()
+  (let ((content "pass\n--\nkey1 :val1\nkey2: please: keep my space after 
colon\n\n"))
+    (should (equal (auth-source-pass--parse-data content)
+                   '(("key1" . "val1")
+                     ("key2" . "please: keep my space after colon"))))))
+
 (defvar auth-source-pass--debug-log nil
   "Contains a list of all messages passed to `auth-source-do-debug`.")
 
@@ -424,21 +430,37 @@ HOSTNAME, USER and PORT are passed unchanged to
   (auth-source-pass--with-store-find-foo
       '(("foo" ("secret" . "foo password")))
     (let ((result (auth-source-pass--build-result "foo" 512 "user")))
+      (should (equal (plist-get result :host) "foo"))
       (should (equal (plist-get result :port) 512))
       (should (equal (plist-get result :user) "user")))))
 
 (ert-deftest auth-source-pass-build-result-return-entry-values ()
   (auth-source-pass--with-store-find-foo '(("foo" ("port" . 512) ("user" . 
"anuser")))
     (let ((result (auth-source-pass--build-result "foo" nil nil)))
+      (should (equal (plist-get result :host) "foo"))
       (should (equal (plist-get result :port) 512))
       (should (equal (plist-get result :user) "anuser")))))
 
 (ert-deftest auth-source-pass-build-result-entry-takes-precedence ()
-  (auth-source-pass--with-store-find-foo '(("foo" ("port" . 512) ("user" . 
"anuser")))
+  (auth-source-pass--with-store-find-foo '(("foo" ("host" . "bar") ("port" . 
512) ("user" . "anuser")))
     (let ((result (auth-source-pass--build-result "foo" 1024 "anotheruser")))
+      (should (equal (plist-get result :host) "bar"))
       (should (equal (plist-get result :port) 512))
       (should (equal (plist-get result :user) "anuser")))))
 
+(ert-deftest auth-source-pass-build-result-with-multiple-hosts ()
+  (auth-source-pass--with-store-find-foo
+      '(("foo" ("secret" . "foo password")))
+    (let ((result (auth-source-pass--build-result '("bar" "foo") 512 "user")))
+      (should (equal (plist-get result :host) "foo"))
+      (should (equal (plist-get result :port) 512))
+      (should (equal (plist-get result :user) "user")))))
+
+(ert-deftest auth-source-pass-build-result-with-multiple-hosts-no-match ()
+  (auth-source-pass--with-store-find-foo
+      '(("foo" ("secret" . "foo password")))
+    (should-not (auth-source-pass--build-result '("bar" "baz") 512 "user"))))
+
 (ert-deftest auth-source-pass-can-start-from-auth-source-search ()
   (auth-source-pass--with-store '(("gitlab.com" ("user" . "someone")))
     (auth-source-pass-enable)
diff --git a/test/lisp/calendar/iso8601-tests.el 
b/test/lisp/calendar/iso8601-tests.el
index 618e5b1..c4d038a 100644
--- a/test/lisp/calendar/iso8601-tests.el
+++ b/test/lisp/calendar/iso8601-tests.el
@@ -183,7 +183,15 @@
   (should (equal (iso8601-parse-time "15:27:35.123" t)
                  '((35123 . 1000) 27 15 nil nil nil nil -1 nil)))
   (should (equal (iso8601-parse-time "15:27:35.123456789" t)
-                 '((35123456789 . 1000000000) 27 15 nil nil nil nil -1 nil))))
+                '((35123456789 . 1000000000) 27 15 nil nil nil nil -1 nil)))
+  (should (equal (iso8601-parse-time "15:27:35.012345678" t)
+                '((35012345678 . 1000000000) 27 15 nil nil nil nil -1 nil)))
+  (should (equal (iso8601-parse-time "15:27:35.00001" t)
+                 '((3500001 . 100000) 27 15 nil nil nil nil -1 nil)))
+  (should (equal (iso8601-parse-time "15:27:35.0000100" t)
+                 '((3500001 . 100000) 27 15 nil nil nil nil -1 nil)))
+  (should (equal (iso8601-parse-time "15:27:35.0" t)
+                 '(35 27 15 nil nil nil nil -1 nil))))
 
 (ert-deftest standard-test-time-of-day-beginning-of-day ()
   (should (equal (iso8601-parse-time "000000")
diff --git a/test/lisp/custom-resources/custom--test-theme.el 
b/test/lisp/custom-resources/custom--test-theme.el
index 122bd79..36424cd 100644
--- a/test/lisp/custom-resources/custom--test-theme.el
+++ b/test/lisp/custom-resources/custom--test-theme.el
@@ -6,6 +6,8 @@
 (custom-theme-set-variables
  'custom--test
  '(custom--test-user-option 'bar)
- '(custom--test-variable 'bar))
+ '(custom--test-variable 'bar)
+ '(custom--test-bug-21355-before 'before)
+ '(custom--test-bug-21355-after 'after))
 
 (provide-theme 'custom--test)
diff --git a/test/lisp/custom-tests.el b/test/lisp/custom-tests.el
index 02a9239..e93c96e 100644
--- a/test/lisp/custom-tests.el
+++ b/test/lisp/custom-tests.el
@@ -230,4 +230,108 @@ Ensure the directory is recursively deleted after the 
fact."
       (should (eq (default-value 'custom--test-local-option) 'initial))
       (should (eq (default-value 'custom--test-permanent-option) 'initial)))))
 
+;; The following three tests demonstrate Bug#21355.
+;; In this one, we set an user option for the current session and then
+;; we enable a theme that doesn't have a setting for it, ending up with
+;; a non-nil saved-value property.  Since the `caar' of the theme-value
+;; property is user (i.e., the user theme setting is active), we might
+;; save the setting to the custom-file, even though it was meant for the
+;; current session only.  So there should be a nil saved-value property
+;; for this test to pass.
+(ert-deftest custom-test-no-saved-value-after-enabling-theme ()
+  "Test that we don't record a saved-value property when we shouldn't."
+  (let ((custom-theme-load-path `(,(ert-resource-directory))))
+    (customize-option 'mark-ring-max)
+    (let* ((field (seq-find (lambda (widget)
+                              (eq mark-ring-max (widget-value widget)))
+                            widget-field-list))
+           (parent (widget-get field :parent)))
+      ;; Move to the editable widget, modify the value and save it.
+      (goto-char (widget-field-text-end field))
+      (insert "0")
+      (widget-apply parent :custom-set)
+      ;; Just setting for the current session should not store a saved-value
+      ;; property.
+      (should-not (get 'mark-ring-max 'saved-value))
+      ;; Now enable and disable the test theme.
+      (load-theme 'custom--test 'no-confirm)
+      (disable-theme 'custom--test)
+      ;; Since the user customized the option, this is OK.
+      (should (eq (caar (get 'mark-ring-max 'theme-value)) 'user))
+      ;; The saved-value property should still be nil.
+      (should-not (get 'mark-ring-max 'saved-value)))))
+
+;; In this second test, we load a theme that has a setting for the user option
+;; above.  We must check that we don't end up with a non-nil saved-value
+;; property and a user setting active in the theme-value property, which
+;; means we might inadvertently save the session setting in the custom-file.
+(defcustom custom--test-bug-21355-before 'foo
+  "User option for `custom-test-no-saved-value-after-enabling-theme-2'."
+  :type 'symbol :group 'emacs)
+
+(ert-deftest custom-test-no-saved-value-after-enabling-theme-2 ()
+  "Test that we don't record a saved-value property when we shouldn't."
+  (let ((custom-theme-load-path `(,(ert-resource-directory))))
+    (customize-option 'custom--test-bug-21355-before)
+    (let* ((field (seq-find
+                   (lambda (widget)
+                     (eq custom--test-bug-21355-before (widget-value widget)))
+                   widget-field-list))
+           (parent (widget-get field :parent)))
+      ;; Move to the editable widget, modify the value and save it.
+      (goto-char (widget-field-text-end field))
+      (insert "bar")
+      (widget-apply parent :custom-set)
+      ;; Just setting for the current session should not store a saved-value
+      ;; property.
+      (should-not (get 'custom--test-bug-21355-before 'saved-value))
+      ;; Now load our test theme, which has a setting for
+      ;; `custom--test-bug-21355-before'.
+      (load-theme 'custom--test 'no-confirm 'no-enable)
+      (enable-theme 'custom--test)
+      ;; Since the user customized the option, this is OK.
+      (should (eq (caar (get 'custom--test-bug-21355-before 'theme-value))
+                  'user))
+      ;; But the saved-value property has to be nil, since the user didn't mark
+      ;; this variable to save for future sessions.
+      (should-not (get 'custom--test-bug-21355-before 'saved-value)))))
+
+(defvar custom--test-bug-21355-after)
+
+;; In this test, we check that stashing a theme value for a not yet defined
+;; option works, but that later on if the user customizes the option for the
+;; current session, we might save the theme setting in the custom file.
+(ert-deftest custom-test-no-saved-value-after-customizing-option ()
+  "Test for a nil saved-value after setting an option for the current session."
+  (let ((custom-theme-load-path `(,(ert-resource-directory))))
+    ;; Check that we correctly stashed the value.
+    (load-theme 'custom--test 'no-confirm 'no-enable)
+    (enable-theme 'custom--test)
+    (should (and (not (boundp 'custom--test-bug-21355-after))
+                 (eq (eval
+                      (car (get 'custom--test-bug-21355-after 'saved-value)))
+                     'after)))
+    ;; Now Emacs finds the defcustom.
+    (defcustom custom--test-bug-21355-after 'initially "..."
+      :type 'symbol :group 'emacs)
+    ;; And we used the stashed value correctly.
+    (should (and (boundp 'custom--test-bug-21355-after)
+                 (eq custom--test-bug-21355-after 'after)))
+    ;; Now customize it.
+    (customize-option 'custom--test-bug-21355-after)
+    (let* ((field (seq-find (lambda (widget)
+                              (eq custom--test-bug-21355-after
+                                  (widget-value widget)))
+                            widget-field-list))
+           (parent (widget-get field :parent)))
+      ;; Move to the editable widget, modify the value and save it.
+      (goto-char (widget-field-text-end field))
+      (insert "bar")
+      (widget-apply parent :custom-set)
+      ;; The user customized the variable, so this is OK.
+      (should (eq (caar (get 'custom--test-bug-21355-after 'theme-value))
+                  'user))
+      ;; But it was only for the current session, so this should not happen.
+      (should-not (get 'custom--test-bug-21355-after 'saved-value)))))
+
 ;;; custom-tests.el ends here
diff --git a/test/lisp/emacs-lisp/bytecomp-resources/bc-test-alpha.el 
b/test/lisp/emacs-lisp/bytecomp-resources/bc-test-alpha.el
new file mode 100644
index 0000000..6997d91
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/bc-test-alpha.el
@@ -0,0 +1,9 @@
+;;; -*- lexical-binding: t -*-
+
+(require 'bc-test-beta)
+
+(defun bc-test-alpha-f (x)
+  (let ((y nil))
+    (list y (bc-test-beta-f x))))
+
+(provide 'bc-test-alpha)
diff --git a/test/lisp/emacs-lisp/bytecomp-resources/bc-test-beta.el 
b/test/lisp/emacs-lisp/bytecomp-resources/bc-test-beta.el
new file mode 100644
index 0000000..9205a13
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/bc-test-beta.el
@@ -0,0 +1,6 @@
+;;; -*- lexical-binding: t -*-
+
+(defsubst bc-test-beta-f (y)
+  y)
+
+(provide 'bc-test-beta)
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index c9ab3ec..33413f5 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -1312,6 +1312,24 @@ compiled correctly."
                    (funcall f 3))
                  4)))
 
+(declare-function bc-test-alpha-f (ert-resource-file "bc-test-alpha.el"))
+
+(ert-deftest bytecomp-defsubst ()
+  ;; Check that lexical variables don't leak into inlined code.  See
+  ;; https://lists.gnu.org/archive/html/emacs-devel/2021-05/msg01227.html
+
+  ;; First, remove any trace of the functions and package defined:
+  (fmakunbound 'bc-test-alpha-f)
+  (fmakunbound 'bc-test-beta-f)
+  (setq features (delq 'bc-test-beta features))
+  ;; Byte-compile one file that uses a function from another file that isn't
+  ;; compiled.
+  (let ((file (ert-resource-file "bc-test-alpha.el"))
+        (load-path (cons (ert-resource-directory) load-path)))
+    (byte-compile-file file)
+    (load-file (concat file "c"))
+    (should (equal (bc-test-alpha-f 'a) '(nil a)))))
+
 ;; Local Variables:
 ;; no-byte-compile: t
 ;; End:
diff --git a/test/lisp/emacs-lisp/copyright-tests.el 
b/test/lisp/emacs-lisp/copyright-tests.el
index 7deb8b5..6bb6e35 100644
--- a/test/lisp/emacs-lisp/copyright-tests.el
+++ b/test/lisp/emacs-lisp/copyright-tests.el
@@ -37,8 +37,12 @@
      . ";; Copyright (C) 2017, 2019 Free Software Foundation, Inc.")
     (";; Copyright (C) 2017-2018 Free Software Foundation, Inc."
      . ";; Copyright (C) 2017-2019 Free Software Foundation, Inc.")
+    (";; Copyright (C) 2017–2018 Free Software Foundation, Inc."
+     . ";; Copyright (C) 2017–2019 Free Software Foundation, Inc.")
     (";; Copyright (C) 2005-2006, 2015, 2017-2018 Free Software Foundation, 
Inc."
      . ";; Copyright (C) 2005-2006, 2015, 2017-2019 Free Software Foundation, 
Inc.")
+    (";; Copyright (C) 2005–2006, 2015, 2017–2018 Free Software Foundation, 
Inc."
+     . ";; Copyright (C) 2005–2006, 2015, 2017–2019 Free Software Foundation, 
Inc.")
     (";; copyright '18 FSF"
      . ";; copyright '18, '19 FSF")))
 
diff --git a/test/lisp/emacs-lisp/edebug-tests.el 
b/test/lisp/emacs-lisp/edebug-tests.el
index 7d45432..2f45050 100644
--- a/test/lisp/emacs-lisp/edebug-tests.el
+++ b/test/lisp/emacs-lisp/edebug-tests.el
@@ -1029,14 +1029,21 @@ clashes (Bug#41853)."
                                     inner@cl-flet@10002
                                     edebug-tests-cl-flet-2)))))))
 
+(defmacro edebug-tests--duplicate-symbol-backtrack (arg)
+  "Helper macro that exemplifies Bug#42701.
+ARG is either (FORM) or (FORM IGNORED)."
+  (declare (debug ([&or (form) (form sexp)])))
+  (car arg))
+
 (ert-deftest edebug-tests-duplicate-symbol-backtrack ()
   "Check that Edebug doesn't create duplicate symbols when
 backtracking (Bug#42701)."
   (with-temp-buffer
-    (dolist (form '((require 'subr-x)
-                    (defun edebug-tests-duplicate-symbol-backtrack ()
-                      (if-let (x (funcall (lambda (y) 1) 2)) 3 4))))
-      (print form (current-buffer)))
+    (print '(defun edebug-tests-duplicate-symbol-backtrack ()
+              (edebug-tests--duplicate-symbol-backtrack
+               ;; Passing (FORM IGNORED) forces backtracking.
+               ((lambda () 123) ignored)))
+           (current-buffer))
     (let* ((edebug-all-defs t)
            (edebug-initial-mode 'Go-nonstop)
            (instrumented-names ())
diff --git a/test/lisp/emacs-lisp/map-tests.el 
b/test/lisp/emacs-lisp/map-tests.el
index 67666d8..a04c6be 100644
--- a/test/lisp/emacs-lisp/map-tests.el
+++ b/test/lisp/emacs-lisp/map-tests.el
@@ -476,5 +476,42 @@ Evaluate BODY for each created map."
                      (list one two))
                    '(1 2)))))
 
+(ert-deftest test-map-setf-alist-insert-key ()
+  (let ((alist))
+    (should (equal (setf (map-elt alist 'key) 'value)
+                   'value))
+    (should (equal alist '((key . value))))))
+
+(ert-deftest test-map-setf-alist-overwrite-key ()
+  (let ((alist '((key . value1))))
+    (should (equal (setf (map-elt alist 'key) 'value2)
+                   'value2))
+    (should (equal alist '((key . value2))))))
+
+(ert-deftest test-map-setf-plist-insert-key ()
+  (let ((plist '(key value)))
+    (should (equal (setf (map-elt plist 'key2) 'value2)
+                   'value2))
+    (should (equal plist '(key value key2 value2)))))
+
+(ert-deftest test-map-setf-plist-overwrite-key ()
+  (let ((plist '(key value)))
+    (should (equal (setf (map-elt plist 'key) 'value2)
+                   'value2))
+    (should (equal plist '(key value2)))))
+
+(ert-deftest test-hash-table-setf-insert-key ()
+  (let ((ht (make-hash-table)))
+    (should (equal (setf (map-elt ht 'key) 'value)
+                  'value))
+    (should (equal (map-elt ht 'key) 'value))))
+
+(ert-deftest test-hash-table-setf-overwrite-key ()
+  (let ((ht (make-hash-table)))
+    (puthash 'key 'value1 ht)
+    (should (equal (setf (map-elt ht 'key) 'value2)
+                  'value2))
+    (should (equal (map-elt ht 'key) 'value2))))
+
 (provide 'map-tests)
 ;;; map-tests.el ends here
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index 2dd1bca..4828df0 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -166,6 +166,20 @@
                         (backref 1))
                     (list u v)))
                  '("1" "3")))
+  (should (equal (pcase "bz"
+                   ((rx "a" (let x nonl)) (list 1 x))
+                   (_ 'no))
+                 'no))
+  (should (equal (pcase "az"
+                   ((rx "a" (let x nonl)) (list 1 x))
+                   ((rx "b" (let x nonl)) (list 2 x))
+                   (_ 'no))
+                 '(1 "z")))
+  (should (equal (pcase "bz"
+                   ((rx "a" (let x nonl)) (list 1 x))
+                   ((rx "b" (let x nonl)) (list 2 x))
+                   (_ 'no))
+                 '(2 "z")))
   (let ((k "blue"))
     (should (equal (pcase "<blue>"
                      ((rx "<" (literal k) ">") 'ok))
diff --git a/test/lisp/emacs-lisp/shortdoc-tests.el 
b/test/lisp/emacs-lisp/shortdoc-tests.el
new file mode 100644
index 0000000..3bb3185
--- /dev/null
+++ b/test/lisp/emacs-lisp/shortdoc-tests.el
@@ -0,0 +1,45 @@
+;;; shortdoc-tests.el --- tests for shortdoc.el   -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+(require 'ert)
+(require 'shortdoc)
+
+(defun shortdoc-tests--tree-contains (tree fun)
+  "Whether TREE contains a call to FUN."
+  (and (proper-list-p tree)
+       (or (eq (car tree) fun)
+           (cl-some (lambda (x) (shortdoc-tests--tree-contains x fun)) tree))))
+
+(ert-deftest shortdoc-examples ()
+  "Check that each example actually contains the corresponding form."
+  (dolist (group shortdoc--groups)
+    (dolist (item group)
+      (when (consp item)
+        (let ((fun (car item))
+              (props (cdr item)))
+          (while props
+            (when (memq (car props) '(:eval :no-eval :no-eval* :no-value))
+              (let* ((example (cadr props))
+                     (expr (cond
+                            ((consp example) example)
+                            ((stringp example) (read example)))))
+                (should (shortdoc-tests--tree-contains expr fun))))
+            (setq props (cddr props))))))))
+
+(provide 'shortdoc-tests)
diff --git a/test/lisp/emacs-lisp/subr-x-tests.el 
b/test/lisp/emacs-lisp/subr-x-tests.el
index 112f3c1..ef04cde 100644
--- a/test/lisp/emacs-lisp/subr-x-tests.el
+++ b/test/lisp/emacs-lisp/subr-x-tests.el
@@ -607,18 +607,21 @@
   (should (equal (string-limit "foó" 4 nil 'utf-8) "fo\303\263"))
   (should (equal (string-limit "foóa" 4 nil 'utf-8) "fo\303\263"))
   (should (equal (string-limit "foóá" 4 nil 'utf-8) "fo\303\263"))
+  (should (equal (string-limit "foóá" 4 nil 'utf-8-with-signature)
+                 "fo\303\263"))
   (should (equal (string-limit "foóa" 4 nil 'iso-8859-1) "fo\363a"))
   (should (equal (string-limit "foóá" 4 nil 'iso-8859-1) "fo\363\341"))
-  (should (equal (string-limit "foóá" 4 nil 'utf-16) "\376\377\000f"))
+  (should (equal (string-limit "foóá" 4 nil 'utf-16) "\000f\000o"))
 
   (should (equal (string-limit "foó" 10 t 'utf-8) "fo\303\263"))
   (should (equal (string-limit "foó" 3 t 'utf-8) "o\303\263"))
   (should (equal (string-limit "foó" 4 t 'utf-8) "fo\303\263"))
   (should (equal (string-limit "foóa" 4 t 'utf-8) "o\303\263a"))
   (should (equal (string-limit "foóá" 4 t 'utf-8) "\303\263\303\241"))
+  (should (equal (string-limit "foóá" 2 t 'utf-8-with-signature) "\303\241"))
   (should (equal (string-limit "foóa" 4 t 'iso-8859-1) "fo\363a"))
   (should (equal (string-limit "foóá" 4 t 'iso-8859-1) "fo\363\341"))
-  (should (equal (string-limit "foóá" 4 t 'utf-16) "\376\377\000\341")))
+  (should (equal (string-limit "foóá" 4 t 'utf-16) "\000\363\000\341")))
 
 (ert-deftest subr-string-lines ()
   (should (equal (string-lines "foo") '("foo")))
diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el
index 13350b2..e0fa66a 100644
--- a/test/lisp/filenotify-tests.el
+++ b/test/lisp/filenotify-tests.el
@@ -200,7 +200,10 @@ Return nil when any other file notification watch is still 
active."
 
 (setq file-notify-debug nil
       password-cache-expiry nil
-      tramp-verbose 0)
+      tramp-verbose 0
+      ;; When the remote user id is 0, Tramp refuses unsafe temporary files.
+      tramp-allow-unsafe-temporary-files
+      (or tramp-allow-unsafe-temporary-files noninteractive))
 
 ;; This should happen on hydra only.
 (when (getenv "EMACS_HYDRA_CI")
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 3371657..257cbc2 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -151,6 +151,19 @@ form.")
         (dolist (subtest (cdr test))
           (should (file-test--do-local-variables-test str subtest)))))))
 
+(ert-deftest files-tests-permanent-local-variables ()
+  (let ((enable-local-variables nil))
+    (with-temp-buffer
+      (insert ";;; test-test.el --- tests  -*- lexical-binding: t; -*-\n\n")
+      (hack-local-variables)
+      (should (eq lexical-binding t))))
+  (let ((enable-local-variables nil)
+        (permanently-enabled-local-variables nil))
+    (with-temp-buffer
+      (insert ";;; test-test.el --- tests  -*- lexical-binding: t; -*-\n\n")
+      (hack-local-variables)
+      (should (eq lexical-binding nil)))))
+
 (defvar files-test-bug-18141-file
   (ert-resource-file "files-bug18141.el.gz")
   "Test file for bug#18141.")
@@ -302,12 +315,15 @@ be $HOME."
                     (file-name-unquote temporary-file-directory))))))
 
 (ert-deftest files-tests-file-name-non-special--subprocess ()
-  "Check that Bug#25949 is fixed."
-  (skip-unless (executable-find "true"))
-  (let ((default-directory (file-name-quote temporary-file-directory)))
-    (should (zerop (process-file "true")))
-    (should (processp (start-file-process "foo" nil "true")))
-    (should (zerop (shell-command "true")))))
+  "Check that Bug#25949 and Bug#48177 are fixed."
+  (skip-unless (and (executable-find "true") (file-exists-p null-device)))
+  (let ((default-directory (file-name-quote temporary-file-directory))
+        (true (file-name-quote (executable-find "true")))
+        (null (file-name-quote null-device)))
+    (should (zerop (process-file true null `((:file ,null) ,null))))
+    (should (processp (start-file-process "foo" nil true)))
+    (should (zerop (shell-command true)))
+    (should (processp (make-process :name "foo" :command `(,true))))))
 
 (defmacro files-tests--with-advice (symbol where function &rest body)
   (declare (indent 3))
@@ -715,9 +731,8 @@ unquoted file names."
           (file (file-name-nondirectory tmpfile))
           (nospecial-file (file-name-nondirectory nospecial)))
       (should-not (string-equal file nospecial-file))
-      (should-not (equal (file-name-all-completions
-                          nospecial-file nospecial-tempdir)
-                         (file-name-all-completions file tmpdir)))
+      (should (equal (file-name-all-completions nospecial-file 
nospecial-tempdir)
+                     (file-name-all-completions file tmpdir)))
       (should (equal (file-name-all-completions file nospecial-tempdir)
                      (file-name-all-completions file tmpdir)))
       (should (equal (file-name-all-completions nospecial-file tmpdir)
@@ -759,8 +774,8 @@ unquoted file names."
           (file (file-name-nondirectory tmpfile))
           (nospecial-file (file-name-nondirectory nospecial)))
       (should-not (string-equal file nospecial-file))
-      (should-not (equal (file-name-completion nospecial-file 
nospecial-tempdir)
-                         (file-name-completion file tmpdir)))
+      (should (equal (file-name-completion nospecial-file nospecial-tempdir)
+                     (file-name-completion file tmpdir)))
       (should (equal (file-name-completion file nospecial-tempdir)
                      (file-name-completion file tmpdir)))
       (should (equal (file-name-completion nospecial-file tmpdir)
@@ -1463,5 +1478,23 @@ The door of all subtleties!
                                (buffer-substring (point-min) (point-max))
                                nil nil)))))
 
+(ert-deftest files-tests-file-name-with-extension-good ()
+  "Test that `file-name-with-extension' succeeds with reasonable input."
+  (should (string= (file-name-with-extension "Jack" "css") "Jack.css"))
+  (should (string= (file-name-with-extension "Jack" ".css") "Jack.css"))
+  (should (string= (file-name-with-extension "Jack.scss" "css") "Jack.css"))
+  (should (string= (file-name-with-extension "/path/to/Jack.md" "org") 
"/path/to/Jack.org")))
+
+(ert-deftest files-tests-file-name-with-extension-bad ()
+  "Test that `file-name-with-extension' fails on malformed input."
+  (should-error (file-name-with-extension nil nil))
+  (should-error (file-name-with-extension "Jack" nil))
+  (should-error (file-name-with-extension nil "css"))
+  (should-error (file-name-with-extension "" ""))
+  (should-error (file-name-with-extension "" "css"))
+  (should-error (file-name-with-extension "Jack" ""))
+  (should-error (file-name-with-extension "Jack" "."))
+  (should-error (file-name-with-extension "/is/a/directory/" "css")))
+
 (provide 'files-tests)
 ;;; files-tests.el ends here
diff --git a/test/lisp/gnus/gnus-util-tests.el 
b/test/lisp/gnus/gnus-util-tests.el
index 959be79..f8d30f6 100644
--- a/test/lisp/gnus/gnus-util-tests.el
+++ b/test/lisp/gnus/gnus-util-tests.el
@@ -132,41 +132,4 @@
   (should (equal '("1") (gnus-setdiff '(2 "1" 2) '(2))))
   (should (equal '("1" "1") (gnus-setdiff '(2 "1" 2 "1") '(2)))))
 
-(ert-deftest gnus-base64-repad ()
-  (should-error (gnus-base64-repad 1)
-                :type 'wrong-type-argument)
-
-  ;; RFC4648 test vectors
-  (should (equal "" (gnus-base64-repad "")))
-  (should (equal "Zg==" (gnus-base64-repad "Zg==")))
-  (should (equal "Zm8=" (gnus-base64-repad "Zm8=")))
-  (should (equal "Zm9v" (gnus-base64-repad "Zm9v")))
-  (should (equal "Zm9vYg==" (gnus-base64-repad "Zm9vYg==")))
-  (should (equal "Zm9vYmE=" (gnus-base64-repad "Zm9vYmE=")))
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9vYmFy")))
-
-  (should (equal "Zm8=" (gnus-base64-repad "Zm8")))
-  (should (equal "Zg==" (gnus-base64-repad "Zg")))
-  (should (equal "Zg==" (gnus-base64-repad "Zg====")))
-
-  (should-error (gnus-base64-repad " ")
-                :type 'error)
-  (should-error (gnus-base64-repad "Zg== ")
-                :type 'error)
-  (should-error (gnus-base64-repad "Z?\x00g==")
-                :type 'error)
-  ;; line-length
-  (should-error (gnus-base64-repad "Zg====" nil 4)
-                :type 'error)
-  ;; reject-newlines
-  (should-error (gnus-base64-repad "Zm9v\r\nYmFy" t)
-                :type 'error)
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9vYmFy" t)))
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9v\r\nYmFy")))
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9v\r\nYmFy\n")))
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9v\r\n YmFy\r\n")))
-  (should (equal "Zm9vYmFy" (gnus-base64-repad "Zm9v \r\n\tYmFy")))
-  (should-error (gnus-base64-repad "Zm9v\r\nYmFy" nil 3)
-                :type 'error))
-
 ;;; gnustest-gnus-util.el ends here
diff --git a/test/lisp/gnus/message-tests.el b/test/lisp/gnus/message-tests.el
index 36ec8c5..b4f2b7f 100644
--- a/test/lisp/gnus/message-tests.el
+++ b/test/lisp/gnus/message-tests.el
@@ -154,6 +154,35 @@
                       "\"larsi@gnus.org\" <larsi@gnus.org>")
                      "larsi@gnus.org")))
 
+(ert-deftest message-replace-header ()
+  (with-temp-buffer
+    (save-excursion
+      (insert "From: dang@gnus.org
+To: user1,
+    user2
+Cc: user3,
+    user4
+--text follows this line--
+Hello.
+"))
+    (save-excursion
+      (message-replace-header "From" "ding@gnus.org")
+      (should (cl-search "ding" (message-field-value "From"))))
+    (save-excursion
+      (message-replace-header "From" "dong@gnus.org" "To")
+      (should (cl-search "dong" (message-field-value "From")))
+      (should (re-search-forward "From:"))
+      (should-error (re-search-forward "To:"))
+      (should (re-search-forward "Cc:")))
+    (save-excursion
+      (message-replace-header "From" "dang@gnus.org" (split-string "To Cc"))
+      (should (cl-search "dang" (message-field-value "From")))
+      (should (re-search-forward "From:"))
+      (should-error (re-search-forward "To:"))
+      ;; That this isn't so is probably a bug from 1997.
+      ;; (should-error (re-search-forward "Cc:"))
+      )))
+
 (provide 'message-mode-tests)
 
 ;;; message-mode-tests.el ends here
diff --git a/test/lisp/help-fns-tests.el b/test/lisp/help-fns-tests.el
index 099d627..513a0c2 100644
--- a/test/lisp/help-fns-tests.el
+++ b/test/lisp/help-fns-tests.el
@@ -62,16 +62,14 @@ Return first line of the output of (describe-function-1 
FUNC)."
     (should (string-match regexp result))))
 
 (ert-deftest help-fns-test-lisp-defun ()
-  (let ((regexp (if (boundp 'comp-ctxt)
+  (let ((regexp (if (featurep 'native-compile)
                     "a native compiled Lisp function in .+subr\\.el"
                   "a compiled Lisp function in .+subr\\.el"))
         (result (help-fns-tests--describe-function 'last)))
     (should (string-match regexp result))))
 
 (ert-deftest help-fns-test-lisp-defsubst ()
-  (let ((regexp (if (boundp 'comp-ctxt)
-                    "a native compiled Lisp function in .+subr\\.el"
-                  "a compiled Lisp function in .+subr\\.el"))
+  (let ((regexp "a compiled Lisp function in .+subr\\.el")
         (result (help-fns-tests--describe-function 'posn-window)))
     (should (string-match regexp result))))
 
diff --git a/test/lisp/help-tests.el b/test/lisp/help-tests.el
index b2fec5c..871417d 100644
--- a/test/lisp/help-tests.el
+++ b/test/lisp/help-tests.el
@@ -110,14 +110,19 @@ C-<tab>           file-cache-minibuffer-complete
 <prior>                switch-to-completions
 <up>           previous-line-or-history-element
 
+M-g            Prefix Command
 M-v            switch-to-completions
 
+M-g ESC                Prefix Command
+
 M-<            minibuffer-beginning-of-buffer
 M-n            next-history-element
 M-p            previous-history-element
 M-r            previous-matching-history-element
 M-s            next-matching-history-element
 
+M-g M-c                switch-to-completions
+
 ")))
 
 (ert-deftest help-tests-substitute-command-keys/keymap-change ()
diff --git a/test/lisp/image-tests.el b/test/lisp/image-tests.el
index 2f7afa2..aa86006 100644
--- a/test/lisp/image-tests.el
+++ b/test/lisp/image-tests.el
@@ -57,8 +57,9 @@
   (should (eq (image-type-from-file-name "foo.png") 'png)))
 
 (ert-deftest image-type/from-filename ()
-  ;; On emba, `image-load-path' does not exist.
-  (skip-unless (bound-and-true-p image-load-path))
+  ;; On emba, `image-types' and `image-load-path' do not exist.
+  (skip-unless (and (bound-and-true-p image-types)
+                    (bound-and-true-p image-load-path)))
   (should (eq (image-type "foo.jpg") 'jpeg)))
 
 (ert-deftest image-type-from-file-header-test ()
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index 6ab5f57..c3ba8f9 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -188,5 +188,148 @@
                   '("some/alpha" "base/epsilon" "base/delta"))
                  `("epsilon" "delta" "beta" "alpha" "gamma"  . 5))))
 
+(defun completion--pcm-score (comp)
+  "Get `completion-score' from COMP."
+  (get-text-property 0 'completion-score comp))
+
+(defun completion--pcm-first-difference-pos (comp)
+  "Get `completions-first-difference' from COMP."
+  (cl-loop for pos = (next-single-property-change 0 'face comp)
+           then (next-single-property-change pos 'face comp)
+           while pos
+           when (eq (get-text-property pos 'face comp)
+                    'completions-first-difference)
+           return pos))
+
+(ert-deftest completion-pcm-test-1 ()
+  ;; Point is at end, this does not match anything
+  (should (null
+           (completion-pcm-all-completions
+            "foo" '("hello" "world" "barfoobar") nil 3))))
+
+(ert-deftest completion-pcm-test-2 ()
+  ;; Point is at beginning, this matches "barfoobar"
+  (should (equal
+           (car (completion-pcm-all-completions
+                 "foo" '("hello" "world" "barfoobar") nil 0))
+           "barfoobar")))
+
+(ert-deftest completion-pcm-test-3 ()
+  ;; Full match!
+  (should (eql
+           (completion--pcm-score
+            (car (completion-pcm-all-completions
+                  "R" '("R" "hello") nil 1)))
+           1.0)))
+
+(ert-deftest completion-pcm-test-4 ()
+  ;; One fourth of a match and no match due to point being at the end
+  (should (eql
+           (completion--pcm-score
+            (car (completion-pcm-all-completions
+                  "RO" '("RaOb") nil 1)))
+           (/ 1.0 4.0)))
+  (should (null
+           (completion-pcm-all-completions
+            "RO" '("RaOb") nil 2))))
+
+(ert-deftest completion-pcm-test-5 ()
+  ;; Since point is at the beginning, there is nothing that can really
+  ;; be typed anymore
+  (should (null
+           (completion--pcm-first-difference-pos
+            (car (completion-pcm-all-completions
+                  "f" '("few" "many") nil 0))))))
+
+(ert-deftest completion-pcm-test-6 ()
+  ;; Wildcards and delimiters work
+  (should (equal
+           (car (completion-pcm-all-completions
+                 "li-pac*" '("list-packages") nil 7))
+           "list-packages"))
+  (should (null
+           (car (completion-pcm-all-completions
+                 "li-pac*" '("do-not-list-packages") nil 7)))))
+
+(ert-deftest completion-substring-test-1 ()
+  ;; One third of a match!
+  (should (equal
+           (car (completion-substring-all-completions
+                 "foo" '("hello" "world" "barfoobar") nil 3))
+           "barfoobar"))
+  (should (eql
+           (completion--pcm-score
+            (car (completion-substring-all-completions
+                  "foo" '("hello" "world" "barfoobar") nil 3)))
+           (/ 1.0 3.0))))
+
+(ert-deftest completion-substring-test-2 ()
+  ;; Full match!
+  (should (eql
+           (completion--pcm-score
+            (car (completion-substring-all-completions
+                  "R" '("R" "hello") nil 1)))
+           1.0)))
+
+(ert-deftest completion-substring-test-3 ()
+  ;; Substring match
+  (should (equal
+           (car (completion-substring-all-completions
+                 "custgroup" '("customize-group") nil 4))
+           "customize-group"))
+  (should (null
+           (car (completion-substring-all-completions
+                 "custgroup" '("customize-group") nil 5)))))
+
+(ert-deftest completion-substring-test-4 ()
+  ;; `completions-first-difference' should be at the right place
+  (should (eql
+           (completion--pcm-first-difference-pos
+            (car (completion-substring-all-completions
+                  "jab" '("dabjobstabby" "many") nil 1)))
+           4))
+  (should (null
+           (completion--pcm-first-difference-pos
+            (car (completion-substring-all-completions
+                  "jab" '("dabjabstabby" "many") nil 1)))))
+  (should (equal
+           (completion--pcm-first-difference-pos
+            (car (completion-substring-all-completions
+                  "jab" '("dabjabstabby" "many") nil 3)))
+           6)))
+
+(ert-deftest completion-flex-test-1 ()
+  ;; Fuzzy match
+  (should (equal
+           (car (completion-flex-all-completions
+                 "foo" '("hello" "world" "fabrobazo") nil 3))
+           "fabrobazo")))
+
+(ert-deftest completion-flex-test-2 ()
+  ;; Full match!
+  (should (eql
+           (completion--pcm-score
+            (car (completion-flex-all-completions
+                  "R" '("R" "hello") nil 1)))
+           1.0)))
+
+(ert-deftest completion-flex-test-3 ()
+  ;; Another fuzzy match, but more of a "substring" one
+  (should (equal
+           (car (completion-flex-all-completions
+                 "custgroup" '("customize-group-other-window") nil 4))
+           "customize-group-other-window"))
+  ;; `completions-first-difference' should be at the right place
+  (should (equal
+           (completion--pcm-first-difference-pos
+            (car (completion-flex-all-completions
+                  "custgroup" '("customize-group-other-window") nil 4)))
+           4))
+  (should (equal
+           (completion--pcm-first-difference-pos
+            (car (completion-flex-all-completions
+                  "custgroup" '("customize-group-other-window") nil 9)))
+           15)))
+
 (provide 'minibuffer-tests)
 ;;; minibuffer-tests.el ends here
diff --git a/test/lisp/net/tramp-archive-tests.el 
b/test/lisp/net/tramp-archive-tests.el
index 6a6b56f..ca1163b 100644
--- a/test/lisp/net/tramp-archive-tests.el
+++ b/test/lisp/net/tramp-archive-tests.el
@@ -292,15 +292,26 @@ variables, so we check the Emacs version directly."
   "Check `expand-file-name'."
   (should
    (string-equal
-    (expand-file-name "/foo.tar/path/./file") "/foo.tar/path/file"))
+    (expand-file-name (concat tramp-archive-test-archive "path/./file"))
+    (concat tramp-archive-test-archive "path/file")))
   (should
-   (string-equal (expand-file-name "/foo.tar/path/../file") "/foo.tar/file"))
+   (string-equal
+    (expand-file-name (concat tramp-archive-test-archive "path/../file"))
+    (concat tramp-archive-test-archive "file")))
   ;; `expand-file-name' does not care "~/" in archive file names.
   (should
-   (string-equal (expand-file-name "/foo.tar/~/file") "/foo.tar/~/file"))
+   (string-equal
+    (expand-file-name (concat tramp-archive-test-archive "~/file"))
+    (concat tramp-archive-test-archive "~/file")))
   ;; `expand-file-name' does not care file archive boundaries.
-  (should (string-equal (expand-file-name "/foo.tar/./file") "/foo.tar/file"))
-  (should (string-equal (expand-file-name "/foo.tar/../file") "/file")))
+  (should
+   (string-equal
+    (expand-file-name (concat tramp-archive-test-archive "./file"))
+    (concat tramp-archive-test-archive "file")))
+  (should
+   (string-equal
+    (expand-file-name (concat tramp-archive-test-archive "../file"))
+    (concat (ert-resource-directory) "file"))))
 
 ;; This test is inspired by Bug#30293.
 (ert-deftest tramp-archive-test05-expand-file-name-non-archive-directory ()
@@ -325,38 +336,59 @@ This checks also `file-name-as-directory', 
`file-name-directory',
 
   (should
    (string-equal
-    (directory-file-name "/foo.tar/path/to/file") "/foo.tar/path/to/file"))
+    (directory-file-name (concat tramp-archive-test-archive "path/to/file"))
+    (concat tramp-archive-test-archive "path/to/file")))
   (should
    (string-equal
-    (directory-file-name "/foo.tar/path/to/file/") "/foo.tar/path/to/file"))
+    (directory-file-name (concat tramp-archive-test-archive "path/to/file/"))
+    (concat tramp-archive-test-archive "path/to/file")))
   ;; `directory-file-name' does not leave file archive boundaries.
-  (should (string-equal (directory-file-name "/foo.tar/") "/foo.tar/"))
+  (should
+   (string-equal
+    (directory-file-name tramp-archive-test-archive) 
tramp-archive-test-archive))
 
   (should
    (string-equal
-    (file-name-as-directory "/foo.tar/path/to/file") "/foo.tar/path/to/file/"))
+    (file-name-as-directory (concat tramp-archive-test-archive "path/to/file"))
+    (concat tramp-archive-test-archive "path/to/file/")))
   (should
    (string-equal
-    (file-name-as-directory "/foo.tar/path/to/file/") 
"/foo.tar/path/to/file/"))
-  (should (string-equal (file-name-as-directory "/foo.tar/") "/foo.tar/"))
-  (should (string-equal (file-name-as-directory "/foo.tar") "/foo.tar/"))
+    (file-name-as-directory (concat tramp-archive-test-archive 
"path/to/file/"))
+    (concat tramp-archive-test-archive "path/to/file/")))
+  (should
+   (string-equal
+    (file-name-as-directory tramp-archive-test-archive)
+    tramp-archive-test-archive))
+  (should
+   (string-equal
+    (file-name-as-directory tramp-archive-test-file-archive)
+    tramp-archive-test-archive))
 
   (should
    (string-equal
-    (file-name-directory "/foo.tar/path/to/file") "/foo.tar/path/to/"))
+    (file-name-directory (concat tramp-archive-test-archive "path/to/file"))
+    (concat tramp-archive-test-archive "path/to/")))
   (should
    (string-equal
-    (file-name-directory "/foo.tar/path/to/file/") "/foo.tar/path/to/file/"))
-  (should (string-equal (file-name-directory "/foo.tar/") "/foo.tar/"))
+    (file-name-directory (concat tramp-archive-test-archive "path/to/file/"))
+    (concat tramp-archive-test-archive "path/to/file/")))
+  (should
+   (string-equal
+    (file-name-directory tramp-archive-test-archive) 
tramp-archive-test-archive))
 
   (should
-   (string-equal (file-name-nondirectory "/foo.tar/path/to/file") "file"))
+   (string-equal
+    (file-name-nondirectory (concat tramp-archive-test-archive "path/to/file"))
+    "file"))
   (should
-   (string-equal (file-name-nondirectory "/foo.tar/path/to/file/") ""))
-  (should (string-equal (file-name-nondirectory "/foo.tar/") ""))
+   (string-equal
+    (file-name-nondirectory (concat tramp-archive-test-archive 
"path/to/file/"))
+    ""))
+  (should (string-equal (file-name-nondirectory tramp-archive-test-archive) 
""))
 
   (should-not
-   (unhandled-file-name-directory "/foo.tar/path/to/file")))
+   (unhandled-file-name-directory
+    (concat tramp-archive-test-archive "path/to/file"))))
 
 (ert-deftest tramp-archive-test07-file-exists-p ()
   "Check `file-exist-p', `write-region' and `delete-file'."
@@ -887,27 +919,35 @@ This tests also `file-executable-p', `file-writable-p' 
and `set-file-modes'."
 
   ;; tramp-archive is neither loaded at Emacs startup, nor when
   ;; loading a file like "/mock::foo" (which loads Tramp).
-  (let ((default-directory (expand-file-name temporary-file-directory))
-       (code
+  (let ((code
         "(progn \
-           (message \"tramp-archive loaded: %%s %%s\" \
-              (featurep 'tramp) (featurep 'tramp-archive)) \
+           (message \"tramp-archive loaded: %%s\" \
+              (featurep 'tramp-archive)) \
            (file-attributes %S \"/\") \
-           (message \"tramp-archive loaded: %%s %%s\" \
-              (featurep 'tramp) (featurep 'tramp-archive)))"))
-    (dolist (file `("/mock::foo" ,(concat tramp-archive-test-archive "foo")))
-      (should
-       (string-match
-       (format
-        "tramp-archive loaded: nil nil[[:ascii:]]+tramp-archive loaded: t %s"
-        (tramp-archive-file-name-p file))
-       (shell-command-to-string
-        (format
-         "%s -batch -Q -L %s --eval %s"
-         (shell-quote-argument
-          (expand-file-name invocation-name invocation-directory))
-         (mapconcat #'shell-quote-argument load-path " -L ")
-         (shell-quote-argument (format code file)))))))))
+           (message \"tramp-archive loaded: %%s\" \
+              (featurep 'tramp-archive)))"))
+    (dolist (default-directory
+              `(,temporary-file-directory
+               ;;  Starting Emacs in a directory which has
+               ;; `tramp-archive-file-name-regexp' syntax is
+               ;; supported only with Emacs > 27.2 (sigh!).
+               ;; (Bug#48476)
+                ,(file-name-as-directory tramp-archive-test-directory)))
+      (dolist (file `("/mock::foo" ,(concat tramp-archive-test-archive "foo")))
+        (should
+         (string-match
+         (format
+          "tramp-archive loaded: %s[[:ascii:]]+tramp-archive loaded: %s"
+          (tramp-archive-file-name-p default-directory)
+          (or (tramp-archive-file-name-p default-directory)
+               (tramp-archive-file-name-p file)))
+         (shell-command-to-string
+          (format
+           "%s -batch -Q -L %s --eval %s"
+           (shell-quote-argument
+            (expand-file-name invocation-name invocation-directory))
+           (mapconcat #'shell-quote-argument load-path " -L ")
+           (shell-quote-argument (format code file))))))))))
 
 (ert-deftest tramp-archive-test45-delay-load ()
   "Check that `tramp-archive' is loaded lazily, only when needed."
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 1eb0d0e..6aa8629 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -179,6 +179,11 @@ The temporary file is not created."
   "Whether `tramp--test-instrument-test-case' run.
 This shall used dynamically bound only.")
 
+;; When `tramp-verbose' is greater than 10, and you want to trace
+;; other functions as well, do something like
+;; (let ((tramp-trace-functions '(file-name-non-special)))
+;;   (tramp--test-instrument-test-case 11
+;;     ...))
 (defmacro tramp--test-instrument-test-case (verbose &rest body)
   "Run BODY with `tramp-verbose' equal VERBOSE.
 Print the content of the Tramp connection and debug buffers, if
@@ -187,31 +192,22 @@ is greater than 10.
 `should-error' is not handled properly.  BODY shall not contain a timeout."
   (declare (indent 1) (debug (natnump body)))
   `(let* ((tramp-verbose (max (or ,verbose 0) (or tramp-verbose 0)))
-         (trace-buffer
-          (when (> tramp-verbose 10) (generate-new-buffer " *temp*")))
+         (trace-buffer (tramp-trace-buffer-name tramp-test-vec))
          (debug-ignored-errors
           (append
            '("^make-symbolic-link not supported$"
              "^error with add-name-to-file")
            debug-ignored-errors))
          inhibit-message)
-     (when trace-buffer
-       (dolist (elt (all-completions "tramp-" obarray 'functionp))
-        (trace-function-background (intern elt))))
      (unwind-protect
         (let ((tramp--test-instrument-test-case-p t)) ,@body)
        ;; Unwind forms.
-       (when trace-buffer
-        (untrace-all))
        (when (and (null tramp--test-instrument-test-case-p) (> tramp-verbose 
3))
-        (dolist
-            (buf (if trace-buffer
-                     (cons (get-buffer trace-buffer) 
(tramp-list-tramp-buffers))
-                   (tramp-list-tramp-buffers)))
+        (untrace-all)
+        (dolist (buf (tramp-list-tramp-buffers))
           (with-current-buffer buf
-            (message ";; %s\n%s" buf (buffer-string)))))
-       (when trace-buffer
-        (kill-buffer trace-buffer)))))
+            (message ";; %s\n%s" buf (buffer-string)))
+          (kill-buffer buf))))))
 
 (defsubst tramp--test-message (fmt-string &rest arguments)
   "Emit a message into ERT *Messages*."
@@ -233,6 +229,16 @@ is greater than 10.
        "%s %f sec"
        ,message (float-time (time-subtract (current-time) start))))))
 
+;; `always' is introduced with Emacs 28.1.
+(defalias 'tramp--test-always
+  (if (fboundp 'always)
+      #'always
+    (lambda (&rest _arguments)
+      "Do nothing and return t.
+This function accepts any number of ARGUMENTS, but ignores them.
+Also see `ignore'."
+      t)))
+
 (ert-deftest tramp-test00-availability ()
   "Test availability of Tramp functions."
   :expected-result (if (tramp--test-enabled) :passed :failed)
@@ -2458,9 +2464,9 @@ This checks also `file-name-as-directory', 
`file-name-directory',
                        tramp--test-messages))))))))
 
            ;; Do not overwrite if excluded.
-           (cl-letf (((symbol-function #'y-or-n-p) (lambda (_prompt) t))
+           (cl-letf (((symbol-function #'y-or-n-p) #'tramp--test-always)
                      ;; Ange-FTP.
-                     ((symbol-function 'yes-or-no-p) (lambda (_prompt) t)))
+                     ((symbol-function 'yes-or-no-p) #'tramp--test-always))
              (write-region "foo" nil tmp-name nil nil nil 'mustbenew))
            ;; `mustbenew' is passed to Tramp since Emacs 26.1.
            (when (tramp--test-emacs26-p)
@@ -3098,7 +3104,6 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
-  (skip-unless (not (tramp--test-windows-nt-and-scp-p)))
   ;; Wildcards are not supported in tramp-crypt.el.
   (skip-unless (not (tramp--test-crypt-p)))
   ;; Since Emacs 26.1.
@@ -3676,7 +3681,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
                (should-error
                 (make-symbolic-link tmp-name1 tmp-name2 0)
                 :type 'file-already-exists)))
-           (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_prompt) t)))
+           (cl-letf (((symbol-function #'yes-or-no-p) #'tramp--test-always))
              (make-symbolic-link tmp-name1 tmp-name2 0)
              (should
               (string-equal
@@ -3752,7 +3757,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
               (should-error
                (add-name-to-file tmp-name1 tmp-name2 0)
                :type 'file-already-exists))
-            (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_prompt) t)))
+            (cl-letf (((symbol-function #'yes-or-no-p) #'tramp--test-always))
               (add-name-to-file tmp-name1 tmp-name2 0)
               (should (file-regular-p tmp-name2)))
             (add-name-to-file tmp-name1 tmp-name2 'ok-if-already-exists)
@@ -4550,7 +4555,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
 If UNSTABLE is non-nil, the test is tagged as `:unstable'."
   (declare (indent 1))
   ;; `make-process' supports file name handlers since Emacs 27.
-  (when (let ((file-name-handler-alist '(("" . (lambda (&rest _) t)))))
+  (when (let ((file-name-handler-alist '(("" . #'tramp--test-always))))
          (ignore-errors (make-process :file-handler t)))
     `(ert-deftest ,(intern (concat (symbol-name test) "-direct-async")) ()
        ,docstring
@@ -4566,7 +4571,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
         ;; `file-truename' does it by side-effect.  Suppress
         ;; `tramp--test-enabled', in order to keep the connection.
         ;; Suppress "Process ... finished" messages.
-        (cl-letf (((symbol-function #'tramp--test-enabled) (lambda nil t))
+        (cl-letf (((symbol-function #'tramp--test-enabled) 
#'tramp--test-always)
                   ((symbol-function #'internal-default-process-sentinel)
                    #'ignore))
           (file-truename tramp-test-temporary-file-directory)
@@ -4586,8 +4591,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
 
   (dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
     (let ((default-directory tramp-test-temporary-file-directory)
-         (tmp-name1 (tramp--test-make-temp-name nil quoted))
-         (tmp-name2 (tramp--test-make-temp-name 'local quoted))
+         (tmp-name (tramp--test-make-temp-name nil quoted))
          kill-buffer-query-functions proc)
       (with-no-warnings (should-not (make-process)))
 
@@ -4615,13 +4619,13 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
       ;; Simple process using a file.
       (unwind-protect
          (with-temp-buffer
-           (write-region "foo" nil tmp-name1)
-           (should (file-exists-p tmp-name1))
+           (write-region "foo" nil tmp-name)
+           (should (file-exists-p tmp-name))
            (setq proc
                  (with-no-warnings
                    (make-process
                     :name "test2" :buffer (current-buffer)
-                    :command `("cat" ,(file-name-nondirectory tmp-name1))
+                    :command `("cat" ,(file-name-nondirectory tmp-name))
                     :file-handler t)))
            (should (processp proc))
            ;; Read output.
@@ -4633,7 +4637,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
        ;; Cleanup.
        (ignore-errors
          (delete-process proc)
-         (delete-file tmp-name1)))
+         (delete-file tmp-name)))
 
       ;; Process filter.
       (unwind-protect
@@ -4697,11 +4701,17 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
                         :stderr stderr
                         :file-handler t)))
                (should (processp proc))
-               ;; Read stderr.
+               ;; Read output.
                (with-timeout (10 (tramp--test-timeout-handler))
                  (while (accept-process-output proc 0 nil t)))
-               (delete-process proc)
+               ;; Read stderr.
                (with-current-buffer stderr
+                 (with-timeout (10 (tramp--test-timeout-handler))
+                   (while (not (string-match-p
+                                "No such file or directory" (buffer-string)))
+                     (while (accept-process-output
+                             (get-buffer-process stderr) 0 nil t))))
+                 (delete-process proc)
                  (should
                   (string-match-p
                    "cat:.* No such file or directory" (buffer-string)))))
@@ -4712,30 +4722,29 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
 
       ;; Process with stderr file.
       (unless (tramp-direct-async-process-p)
-       (dolist (tmpfile `(,tmp-name1 ,tmp-name2))
-         (unwind-protect
+       (unwind-protect
+           (with-temp-buffer
+             (setq proc
+                   (with-no-warnings
+                     (make-process
+                      :name "test6" :buffer (current-buffer)
+                      :command '("cat" "/does-not-exist")
+                      :stderr tmp-name
+                      :file-handler t)))
+             (should (processp proc))
+             ;; Read stderr.
+             (with-timeout (10 (tramp--test-timeout-handler))
+               (while (accept-process-output proc nil nil t)))
+             (delete-process proc)
              (with-temp-buffer
-               (setq proc
-                     (with-no-warnings
-                       (make-process
-                        :name "test6" :buffer (current-buffer)
-                        :command '("cat" "/does-not-exist")
-                        :stderr tmpfile
-                        :file-handler t)))
-               (should (processp proc))
-               ;; Read stderr.
-               (with-timeout (10 (tramp--test-timeout-handler))
-                 (while (accept-process-output proc nil nil t)))
-               (delete-process proc)
-               (with-temp-buffer
-                 (insert-file-contents tmpfile)
-                 (should
-                  (string-match-p
-                   "cat:.* No such file or directory" (buffer-string)))))
+               (insert-file-contents tmp-name)
+               (should
+                (string-match-p
+                 "cat:.* No such file or directory" (buffer-string)))))
 
-           ;; Cleanup.
-           (ignore-errors (delete-process proc))
-           (ignore-errors (delete-file tmpfile))))))))
+         ;; Cleanup.
+         (ignore-errors (delete-process proc))
+         (ignore-errors (delete-file tmp-name)))))))
 
 (tramp--test--deftest-direct-async-process tramp-test30-make-process
   "Check direct async `make-process'.")
@@ -5555,11 +5564,38 @@ Use direct async.")
                         ("]" . "_r"))
                       (tramp-compat-file-name-unquote tmp-name1)))
                     tmp-name2)))
-                 (should (file-directory-p tmp-name2))))))
+                 (should (file-directory-p tmp-name2)))))
+
+           ;; Create temporary file.  This shall check for sensible
+           ;; files, owned by root.
+           (let ((tramp-auto-save-directory temporary-file-directory)
+                 tramp-allow-unsafe-temporary-files)
+             (write-region "foo" nil tmp-name1)
+             (when (zerop (or (tramp-compat-file-attribute-user-id
+                               (file-attributes tmp-name1))
+                              tramp-unknown-id-integer))
+               (with-temp-buffer
+                 (setq buffer-file-name tmp-name1)
+                 (tramp-cleanup-connection
+                  tramp-test-vec 'keep-debug 'keep-password)
+                 (let ((tramp-allow-unsafe-temporary-files t))
+                   (should (stringp (make-auto-save-file-name))))
+                 (tramp-cleanup-connection
+                  tramp-test-vec 'keep-debug 'keep-password)
+                 (cl-letf (((symbol-function #'yes-or-no-p) #'ignore))
+                   (should-error
+                    (make-auto-save-file-name)
+                    :type 'file-error))
+                 (tramp-cleanup-connection
+                  tramp-test-vec 'keep-debug 'keep-password)
+                 (cl-letf (((symbol-function #'yes-or-no-p)
+                            #'tramp--test-always))
+                   (should (stringp (make-auto-save-file-name))))))))
 
        ;; Cleanup.
        (ignore-errors (delete-file tmp-name1))
-       (ignore-errors (delete-directory tmp-name2 'recursive))))))
+       (ignore-errors (delete-directory tmp-name2 'recursive))
+       (tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)))))
 
 (ert-deftest tramp-test38-find-backup-file-name ()
   "Check `find-backup-file-name'."
@@ -5673,7 +5709,37 @@ Use direct async.")
              (should (file-directory-p tmp-name2))))
 
        ;; Cleanup.
-       (ignore-errors (delete-directory tmp-name2 'recursive))))))
+       (ignore-errors (delete-directory tmp-name2 'recursive)))
+
+      (unwind-protect
+         ;; Create temporary file.  This shall check for sensible
+         ;; files, owned by root.
+         (let ((backup-directory-alist `(("." . ,temporary-file-directory)))
+               tramp-allow-unsafe-temporary-files
+               tramp-backup-directory-alist)
+           (write-region "foo" nil tmp-name1)
+           (when (zerop (or (tramp-compat-file-attribute-user-id
+                             (file-attributes tmp-name1))
+                            tramp-unknown-id-integer))
+             (tramp-cleanup-connection
+              tramp-test-vec 'keep-debug 'keep-password)
+             (let ((tramp-allow-unsafe-temporary-files t))
+               (should (stringp (car (find-backup-file-name tmp-name1)))))
+             (tramp-cleanup-connection
+              tramp-test-vec 'keep-debug 'keep-password)
+             (cl-letf (((symbol-function #'yes-or-no-p) #'ignore))
+               (should-error
+                (find-backup-file-name tmp-name1)
+                :type 'file-error))
+             (tramp-cleanup-connection
+              tramp-test-vec 'keep-debug 'keep-password)
+             (cl-letf (((symbol-function #'yes-or-no-p)
+                        #'tramp--test-always))
+               (should (stringp (car (find-backup-file-name tmp-name1)))))))
+
+       ;; Cleanup.
+       (ignore-errors (delete-file tmp-name1))
+       (tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)))))
 
 ;; The functions were introduced in Emacs 26.1.
 (ert-deftest tramp-test39-make-nearby-temp-file ()
@@ -5846,13 +5912,6 @@ This does not support utf8 based file transfer."
   (and (eq system-type 'windows-nt)
        (tramp-method-out-of-band-p tramp-test-vec 1)))
 
-(defun tramp--test-windows-nt-and-scp-p ()
-  "Check, whether the locale host runs MS Windows, and scpx? is used.
-This does not support utf8 based file transfer."
-  (and (eq system-type 'windows-nt)
-       (string-match-p
-       "^scpx?" (file-remote-p tramp-test-temporary-file-directory 'method))))
-
 (defun tramp--test-windows-nt-or-smb-p ()
   "Check, whether the locale or remote host runs MS Windows.
 This requires restrictions of file name syntax."
@@ -5886,6 +5945,7 @@ This requires restrictions of file name syntax."
            (make-directory tmp-name2)
 
            (dolist (elt files)
+             ;(tramp--test-message "%s" elt)
              (let* ((file1 (expand-file-name elt tmp-name1))
                     (file2 (expand-file-name elt tmp-name2))
                     (file3 (expand-file-name (concat elt "foo") tmp-name1)))
@@ -6075,9 +6135,9 @@ This requires restrictions of file name syntax."
                 "\tfoo bar baz\t")
                (t " foo\tbar baz\t"))
          "@foo@bar@baz@"
-         "$foo$bar$$baz$"
+         (unless (tramp--test-windows-nt-and-out-of-band-p) "$foo$bar$$baz$")
          "-foo-bar-baz-"
-         "%foo%bar%baz%"
+         (unless (tramp--test-windows-nt-and-out-of-band-p) "%foo%bar%baz%")
          "&foo&bar&baz&"
          (unless (or (tramp--test-ftp-p)
                      (tramp--test-gvfs-p)
@@ -6091,9 +6151,10 @@ This requires restrictions of file name syntax."
              "'foo'bar'baz'"
            "'foo\"bar'baz\"")
          "#foo~bar#baz~"
-         (if (or (tramp--test-gvfs-p) (tramp--test-windows-nt-or-smb-p))
-             "!foo!bar!baz!"
-           "!foo|bar!baz|")
+         (unless (tramp--test-windows-nt-and-out-of-band-p)
+           (if (or (tramp--test-gvfs-p) (tramp--test-windows-nt-or-smb-p))
+               "!foo!bar!baz!"
+             "!foo|bar!baz|"))
          (if (or (tramp--test-gvfs-p)
                  (tramp--test-rclone-p)
                  (tramp--test-windows-nt-or-smb-p))
@@ -6114,7 +6175,6 @@ This requires restrictions of file name syntax."
   "Check special characters in file names."
   (skip-unless (tramp--test-enabled))
   (skip-unless (not (tramp--test-rsync-p)))
-  (skip-unless (not (tramp--test-windows-nt-and-scp-p)))
   (skip-unless (or (tramp--test-emacs26-p) (not (tramp--test-rclone-p))))
 
   (tramp--test-special-characters))
@@ -6126,7 +6186,6 @@ Use the `stat' command."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
-  (skip-unless (not (tramp--test-windows-nt-and-scp-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
   (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
     (skip-unless (tramp-get-remote-stat v)))
@@ -6145,7 +6204,6 @@ Use the `perl' command."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
-  (skip-unless (not (tramp--test-windows-nt-and-scp-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
   (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
     (skip-unless (tramp-get-remote-perl v)))
@@ -6167,7 +6225,6 @@ Use the `ls' command."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
-  (skip-unless (not (tramp--test-windows-nt-and-scp-p)))
 
   (let ((tramp-connection-properties
         (append
@@ -6223,8 +6280,9 @@ Use the `ls' command."
                      x ""))
              (not (string-empty-p x))
             ;; ?\n and ?/ shouldn't be part of any file name.  ?\t,
-            ;; ?. and ?? do not work for "smb" method.
-            (replace-regexp-in-string "[\t\n/.?]" "" x)))
+            ;; ?. and ?? do not work for "smb" method.  " " does not
+            ;; work at begin or end of the string for MS Windows.
+            (replace-regexp-in-string "[ \t\n/.?]" "" x)))
          language-info-alist)))))))
 
 (ert-deftest tramp-test41-utf8 ()
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-bug-22355.pl 
b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-22355.pl
new file mode 100644
index 0000000..f54d552
--- /dev/null
+++ b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-22355.pl
@@ -0,0 +1,14 @@
+# The source file contains non-ASCII characters, supposed to be saved
+# in UTF-8 encoding.  Tell Perl about that, just in case.
+use utf8;
+
+# Following code is the example from the report Bug#22355 which needed
+# attention in perl-mode.
+
+printf qq
+{<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2";>
+ <Document>
+  <Folder><name>台灣 %s 廣播電台</name>
+  <description><![CDATA[http://radioscanningtw.wikia.com/wiki/台描:地圖 
%d-%02d-%02d]]></description>
+}, uc( substr( $ARGV[0], 0, 2 ) ), $year + 1900, $mon + 1, $mday;
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl 
b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl
new file mode 100644
index 0000000..1db639c
--- /dev/null
+++ b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl
@@ -0,0 +1,10 @@
+# Test file for Bug#23992
+#
+# The "||" case is directly from the report,
+# the "&&" case has been added for symmetry.
+
+s/LEFT/L/g || s/RIGHT/R/g || s/aVALUE\D+//g;
+s/LEFT/L/g||s/RIGHT/R/g||s/aVALUE\D+//g;
+
+s/LEFT/L/g && s/RIGHT/R/g && s/aVALUE\D+//g;
+s/LEFT/L/g&&s/RIGHT/R/g&&s/aVALUE\D+//g;
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-bug-25098.pl 
b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-25098.pl
new file mode 100644
index 0000000..0987b4e
--- /dev/null
+++ b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-25098.pl
@@ -0,0 +1,21 @@
+# Code from the bug report Bug#25098
+
+my $good = XML::LibXML->load_xml( string => q{<div class="clearfix">});
+my $bad  = XML::LibXML->load_xml( string =>q{<div class="clearfix">});
+
+# Related: Method calls are no quotelike operators.  That's why you
+# can't just add '>' to the character class.
+
+my $method_call  = $object->q(argument);
+
+# Also related, still not fontified correctly:
+#
+#     my $method_call  = $object -> q (argument);
+#
+# perl-mode interprets the method call as a quotelike op (because it
+# is preceded by a space).
+# cperl-mode gets the argument right, but marks q as a quotelike op.
+#
+#     my $greater = 2>q/1/;
+#
+# perl-mode doesn't identify this as a quotelike op.
diff --git a/test/lisp/progmodes/cperl-mode-tests.el 
b/test/lisp/progmodes/cperl-mode-tests.el
index 9867aa8..4d2bac6 100644
--- a/test/lisp/progmodes/cperl-mode-tests.el
+++ b/test/lisp/progmodes/cperl-mode-tests.el
@@ -37,7 +37,7 @@
 ;;; Utilities
 
 (defun cperl-test-ppss (text regexp)
-  "Return the `syntax-ppss' of the first character matched by REGEXP in TEXT."
+  "Return the `syntax-ppss' after the last character matched by REGEXP in 
TEXT."
   (interactive)
   (with-temp-buffer
     (insert text)
@@ -377,6 +377,55 @@ documentation it does the right thing anyway."
      (cperl-indent-command)
      (forward-line 1))))
 
+(ert-deftest cperl-test-bug-22355 ()
+  "Verify that substitutions are fontified directly after \"|&\".
+Regular expressions are strings in both perl-mode and cperl-mode."
+  (with-temp-buffer
+    (insert-file-contents (ert-resource-file "cperl-bug-22355.pl"))
+    (funcall cperl-test-mode)
+    (goto-char (point-min))
+    ;; Just check for the start of the string
+    (search-forward "{")
+    (should (nth 3 (syntax-ppss)))))
+
+(ert-deftest cperl-test-bug-23992 ()
+  "Verify that substitutions are fontified directly after \"|&\".
+Regular expressions are strings in both perl-mode and cperl-mode."
+  (with-temp-buffer
+    (insert-file-contents (ert-resource-file "cperl-bug-23992.pl"))
+    (funcall cperl-test-mode)
+    (goto-char (point-min))
+    ;; "or" operator, with spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "or" operator, without spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "and" operator, with spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "and" operator, without spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))))
+
+(ert-deftest cperl-test-bug-25098 ()
+  "Verify that a quotelike operator is recognized after a fat comma \"=>\".
+Related, check that calling a method named q is not mistaken as a
+quotelike operator."
+  (with-temp-buffer
+    (insert-file-contents (ert-resource-file "cperl-bug-25098.pl"))
+    (funcall cperl-test-mode)
+    (goto-char (point-min))
+    ;; good example from the bug report, with a space
+    (search-forward "q{")
+    (should (nth 3 (syntax-ppss)))
+    ;; bad (but now fixed) example from the bug report, without space
+    (search-forward "q{")
+    (should (nth 3 (syntax-ppss)))
+    ;; calling a method "q" (parens instead of braces to make it valid)
+    (search-forward "q(")
+    (should-not (nth 3 (syntax-ppss)))))
+
 (ert-deftest cperl-test-bug-28650 ()
   "Verify that regular expressions are recognized after 'return'.
 The test uses the syntax property \"inside a string\" for the
@@ -448,14 +497,14 @@ If seen as regular expression, then the slash is 
displayed using
 font-lock-constant-face.  If seen as a division, then it doesn't
 have a face property."
   :tags '(:fontification)
-  ;; The next two Perl expressions have divisions.  Perl "punctuation"
-  ;; operators don't get a face.
+  ;; The next two Perl expressions have divisions.  The slash does not
+  ;; start a string.
   (let ((code "{ $a++ / $b }"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) nil)))
   (let ((code "{ $a-- / $b }"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) nil)))
-  ;; The next two Perl expressions have regular expressions.  The
-  ;; delimiter of a RE is fontified with font-lock-constant-face.
+  ;; The next two Perl expressions have regular expressions. The slash
+  ;; starts a string.
   (let ((code "{ $a+ / $b } # /"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) 7)))
   (let ((code "{ $a- / $b } # /"))
@@ -524,4 +573,31 @@ however, must not happen when the keyword occurs in a 
variable
     ;; No block should have been created here
     (should-not (search-forward-regexp "{" nil t))))
 
+(ert-deftest cperl-test-bug-47598 ()
+  "Check that a file test followed by ? is no longer interpreted
+as a regex."
+  ;; Testing the text from the bug report
+  (with-temp-buffer
+    (insert "my $f = -f ? 'file'\n")
+    (insert "      : -l ? [readlink]\n")
+    (insert "      : -d ? 'dir'\n")
+    (insert "      : 'unknown';\n")
+    (funcall cperl-test-mode)
+    ;; Perl mode doesn't highlight file tests as functions, so we
+    ;; can't test for the function's face.  But we can verify that the
+    ;; function is not a string.
+    (goto-char (point-min))
+    (search-forward "?")
+    (should-not (nth 3 (syntax-ppss (point)))))
+  ;; Testing the actual targets for the regexp: m?foo? (still valid)
+  ;; and ?foo? (invalid since Perl 5.22)
+  (with-temp-buffer
+    (insert "m?foo?;")
+    (funcall cperl-test-mode)
+    (should (nth 3 (syntax-ppss 3))))
+  (with-temp-buffer
+    (insert " ?foo?;")
+    (funcall cperl-test-mode)
+    (should-not (nth 3 (syntax-ppss 3)))))
+
 ;;; cperl-mode-tests.el ends here
diff --git a/test/lisp/progmodes/grep-tests.el 
b/test/lisp/progmodes/grep-tests.el
new file mode 100644
index 0000000..2059822
--- /dev/null
+++ b/test/lisp/progmodes/grep-tests.el
@@ -0,0 +1,69 @@
+;;; grep-tests.el --- Test suite for grep.el  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'grep)
+
+(defconst grep-tests--ellipsis (if (char-displayable-p ?…) "[…]" "[...]")
+  "The form that the ellipsis takes in `grep-find-abbreviate-properties'.")
+
+(defun grep-tests--get-rgrep-abbreviation ()
+  "Get the `display' property of the excessive part of the rgrep command."
+  (with-temp-buffer
+    (grep-compute-defaults)
+    (insert (rgrep-default-command "search" "*" nil))
+    (grep-mode)
+    (font-lock-mode)
+    (font-lock-ensure)
+    (goto-char (point-min))
+    (re-search-forward "find ")
+    (get-text-property (point) 'display)))
+
+(defun grep-tests--check-rgrep-abbreviation ()
+  "Check that the excessive part of the rgrep command is abbreviated iff
+`grep-find-abbreviate' is non-nil."
+  (let ((grep-find-abbreviate t))
+    (should (equal (grep-tests--get-rgrep-abbreviation)
+                   grep-tests--ellipsis)))
+  (let ((grep-find-abbreviate nil))
+    (should-not (grep-tests--get-rgrep-abbreviation))))
+
+(ert-deftest grep-tests--rgrep-abbreviate-properties-gnu-linux ()
+  (let ((system-type 'gnu/linux))
+    (grep-tests--check-rgrep-abbreviation)))
+
+(ert-deftest grep-tests--rgrep-abbreviate-properties-darwin ()
+  (let ((system-type 'darwin))
+    (grep-tests--check-rgrep-abbreviation)))
+
+(ert-deftest grep-tests--rgrep-abbreviate-properties-windows-nt-dos-semantics 
()
+  (let ((system-type 'windows-nt))
+    (cl-letf (((symbol-function 'w32-shell-dos-semantics) #'always))
+      (grep-tests--check-rgrep-abbreviation))))
+
+(ert-deftest grep-tests--rgrep-abbreviate-properties-windows-nt-sh-semantics ()
+  (let ((system-type 'windows-nt))
+    (cl-letf (((symbol-function 'w32-shell-dos-semantics) #'ignore))
+      (grep-tests--check-rgrep-abbreviation))))
+
+;;; grep-tests.el ends here
diff --git a/test/lisp/progmodes/octave-tests.el 
b/test/lisp/progmodes/octave-tests.el
new file mode 100644
index 0000000..e28fe73
--- /dev/null
+++ b/test/lisp/progmodes/octave-tests.el
@@ -0,0 +1,49 @@
+;;; octave-tests.el --- Test suite for octave.el  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'octave)
+
+(defun octave-test--indent (string)
+  (with-temp-buffer
+    (octave-mode)
+    (insert string)
+    (indent-region (point-min) (point-max))
+    (buffer-string)))
+
+(ert-deftest octave-tests--continuation-indentation ()
+  (should
+   (equal (octave-test--indent "a = b + a * \\
+c;
+")
+          "a = b + a * \\
+       c;
+"))
+  (should (equal (octave-test--indent "a = \\
+b;
+")
+                 "a = \\
+  b;
+")))
+
+;;; octave-tests.el ends here
diff --git a/test/lisp/progmodes/project-tests.el 
b/test/lisp/progmodes/project-tests.el
index c8c03aa..68460a9 100644
--- a/test/lisp/progmodes/project-tests.el
+++ b/test/lisp/progmodes/project-tests.el
@@ -82,4 +82,29 @@ quoted directory names (Bug#47799)."
            (ert-fail (format-message "Unexpected references: %S"
                                      otherwise))))))))
 
+(cl-defstruct project-tests--trivial root ignores)
+
+(cl-defmethod project-root ((project project-tests--trivial))
+  (project-tests--trivial-root project))
+
+(cl-defmethod project-ignores ((project project-tests--trivial) _dir)
+  (project-tests--trivial-ignores project))
+
+(ert-deftest project-ignores ()
+  "Check that `project-files' correctly ignores the files
+returned by `project-ignores' if the root directory is a
+directory name (Bug#48471)."
+  (skip-unless (executable-find find-program))
+  (project-tests--with-temporary-directory dir
+    (make-empty-file (expand-file-name "some-file" dir))
+    (make-empty-file (expand-file-name "ignored-file" dir))
+    (let* ((project (make-project-tests--trivial
+                     :root (file-name-as-directory dir)
+                     :ignores '("./ignored-file")))
+           (files (project-files project))
+           (relative-files
+            (cl-loop for file in files
+                     collect (file-relative-name file dir))))
+      (should (equal relative-files '("some-file"))))))
+
 ;;; project-tests.el ends here
diff --git a/test/lisp/progmodes/python-tests.el 
b/test/lisp/progmodes/python-tests.el
index 3e653cb..1af579b 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -5432,6 +5432,30 @@ buffer with overlapping strings."
     (run-python nil nil 'show)
     (should (eq buffer (current-buffer)))))
 
+(ert-deftest python-tests--fill-long-first-line ()
+  (should
+   (equal
+    (with-temp-buffer
+      (insert "def asdf():
+    \"\"\"123 123 123 123 123 123 123 123 123 123 123 123 123 SHOULDBEWRAPPED 
123 123 123 123
+
+    \"\"\"
+    a = 1
+")
+      (python-mode)
+      (goto-char (point-min))
+      (forward-line 1)
+      (end-of-line)
+      (fill-paragraph)
+      (buffer-substring-no-properties (point-min) (point-max)))
+    "def asdf():
+    \"\"\"123 123 123 123 123 123 123 123 123 123 123 123 123
+    SHOULDBEWRAPPED 123 123 123 123
+
+    \"\"\"
+    a = 1
+")))
+
 (provide 'python-tests)
 
 ;; Local Variables:
diff --git a/test/lisp/progmodes/xref-tests.el 
b/test/lisp/progmodes/xref-tests.el
index 66099dc..d294522 100644
--- a/test/lisp/progmodes/xref-tests.el
+++ b/test/lisp/progmodes/xref-tests.el
@@ -117,18 +117,14 @@
     (should (null (marker-position (cdr (nth 0 (cdr cons2))))))))
 
 (ert-deftest xref--xref-file-name-display-is-abs ()
-  (let* ((xref-file-name-display 'abs)
-         ;; Some older BSD find versions can produce '//' in the output.
-         (expected (list
-                    (concat xref-tests--data-dir "/?file1.txt")
-                    (concat xref-tests--data-dir "/?file2.txt")))
-         (actual (delete-dups
-                  (mapcar 'xref-location-group
-                          (xref-tests--locations-in-data-dir 
"\\(bar\\|foo\\)")))))
-    (should (= (length expected) (length actual)))
-    (should (cl-every (lambda (e1 e2)
-                        (string-match-p e1 e2))
-                      expected actual))))
+  (let ((xref-file-name-display 'abs))
+    (should (equal
+             (delete-dups
+              (mapcar 'xref-location-group
+                      (xref-tests--locations-in-data-dir "\\(bar\\|foo\\)")))
+             (list
+              (concat xref-tests--data-dir "file1.txt")
+              (concat xref-tests--data-dir "file2.txt"))))))
 
 (ert-deftest xref--xref-file-name-display-is-nondirectory ()
   (let ((xref-file-name-display 'nondirectory))
@@ -144,17 +140,13 @@
           (file-name-directory (directory-file-name xref-tests--data-dir)))
          (project-find-functions
           (lambda (_) (cons 'transient data-parent-dir)))
-         (xref-file-name-display 'project-relative)
-         ;; Some older BSD find versions can produce '//' in the output.
-         (expected (list
-                    "xref-resources//?file1.txt"
-                    "xref-resources//?file2.txt"))
-         (actual (delete-dups
-                  (mapcar 'xref-location-group
-                          (xref-tests--locations-in-data-dir 
"\\(bar\\|foo\\)")))))
-    (should (and (= (length expected) (length actual))
-                 (cl-every (lambda (e1 e2)
-                             (string-match-p e1 e2))
-                           expected actual)))))
+         (xref-file-name-display 'project-relative))
+    (should (equal
+             (delete-dups
+              (mapcar 'xref-location-group
+                      (xref-tests--locations-in-data-dir "\\(bar\\|foo\\)")))
+             (list
+              "xref-resources/file1.txt"
+              "xref-resources/file2.txt")))))
 
 ;;; xref-tests.el ends here
diff --git a/test/lisp/shadowfile-tests.el b/test/lisp/shadowfile-tests.el
index 7b9c2ff..7c9d05a 100644
--- a/test/lisp/shadowfile-tests.el
+++ b/test/lisp/shadowfile-tests.el
@@ -72,6 +72,9 @@
 (setq password-cache-expiry nil
       shadow-debug (getenv "EMACS_HYDRA_CI")
       tramp-verbose 0
+      ;; When the remote user id is 0, Tramp refuses unsafe temporary files.
+      tramp-allow-unsafe-temporary-files
+      (or tramp-allow-unsafe-temporary-files noninteractive)
       ;; On macOS, `temporary-file-directory' is a symlinked directory.
       temporary-file-directory (file-truename temporary-file-directory)
       shadow-test-remote-temporary-file-directory
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 1e14673..375251c 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -684,5 +684,15 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350.";
   (should (>= (length (apropos-internal "^help" #'commandp)) 15))
   (should-not (apropos-internal "^next-line$" #'keymapp)))
 
+
+(ert-deftest test-buffer-local-boundp ()
+  (let ((buf (generate-new-buffer "boundp")))
+    (with-current-buffer buf
+      (setq-local test-boundp t))
+    (setq test-global-boundp t)
+    (should (buffer-local-boundp 'test-boundp buf))
+    (should-not (buffer-local-boundp 'test-not-boundp buf))
+    (should (buffer-local-boundp 'test-global-boundp buf))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here
diff --git a/test/lisp/textmodes/css-mode-tests.el 
b/test/lisp/textmodes/css-mode-tests.el
index 97f5abf..abf85db 100644
--- a/test/lisp/textmodes/css-mode-tests.el
+++ b/test/lisp/textmodes/css-mode-tests.el
@@ -143,20 +143,20 @@
     (css-mode)
     (insert "body:a")
     (let ((completions (css-mode-tests--completions)))
-      (should (member "active" completions))
-      (should-not (member "disabled" completions))
+      (should (member ":active" completions))
+      (should-not (member ":disabled" completions))
       ;; Don't include pseudo-elements
-      (should-not (member "after" completions)))))
+      (should-not (member "::after" completions)))))
 
 (ert-deftest css-test-complete-pseudo-element ()
   (with-temp-buffer
     (css-mode)
     (insert "body::a")
     (let ((completions (css-mode-tests--completions)))
-      (should (member "after" completions))
-      (should-not (member "disabled" completions))
+      (should (member "::after" completions))
+      (should-not (member "::disabled" completions))
       ;; Don't include pseudo-classes
-      (should-not (member "active" completions)))))
+      (should-not (member ":active" completions)))))
 
 (ert-deftest css-test-complete-at-rule ()
   (with-temp-buffer
diff --git a/test/lisp/textmodes/sgml-mode-tests.el 
b/test/lisp/textmodes/sgml-mode-tests.el
index 697c96c..b4c0186 100644
--- a/test/lisp/textmodes/sgml-mode-tests.el
+++ b/test/lisp/textmodes/sgml-mode-tests.el
@@ -204,5 +204,32 @@ The point is set to the beginning of the buffer."
     (should (= 1 (- (car (syntax-ppss (1- (point-max))))
                     (car (syntax-ppss (point-max))))))))
 
+(ert-deftest sgml-test-brackets ()
+  "Test fontification of apostrophe preceded by paired-bracket character."
+  (let (brackets)
+    (map-char-table
+     (lambda (key value)
+       (setq brackets (cons (list
+                            (if (consp key)
+                                (list (car key) (cdr key))
+                              key)
+                            value)
+                           brackets)))
+     (unicode-property-table-internal 'paired-bracket))
+    (setq brackets (delete-dups (flatten-tree brackets)))
+    (setq brackets (append brackets (list ?$ ?% ?& ?* ?+ ?/)))
+    (with-temp-buffer
+      (while brackets
+       (let ((char (string (pop brackets))))
+         (insert (concat "<p>" char "'s</p>\n"))))
+      (html-mode)
+      (font-lock-ensure (point-min) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (goto-char (next-single-char-property-change (point) 'face))
+       (let ((val (get-text-property (point) 'face)))
+         (when val
+           (should-not (eq val 'font-lock-string-face))))))))
+
 (provide 'sgml-mode-tests)
 ;;; sgml-mode-tests.el ends here
diff --git a/test/lisp/time-stamp-tests.el b/test/lisp/time-stamp-tests.el
index 4ae3c19..e42a58a 100644
--- a/test/lisp/time-stamp-tests.el
+++ b/test/lisp/time-stamp-tests.el
@@ -486,7 +486,10 @@
   "Test time-stamp format %Y."
   (with-time-stamp-test-env
     ;; implemented since 1997, documented since 2019
-    (should (equal (time-stamp-string "%Y" ref-time1) "2006"))))
+    (should (equal (time-stamp-string "%Y" ref-time1) "2006"))
+    ;; numbers do not truncate
+    (should (equal (time-stamp-string "%2Y" ref-time1) "2006"))
+    (should (equal (time-stamp-string "%02Y" ref-time1) "2006"))))
 
 (ert-deftest time-stamp-format-am-pm ()
   "Test time-stamp formats for AM and PM strings."
@@ -522,7 +525,7 @@
       (should (equal (time-stamp-string "%#Z" ref-time1) utc-abbr)))))
 
 (ert-deftest time-stamp-format-time-zone-offset ()
-  "Test time-stamp format %z."
+  "Tests time-stamp legacy format %z and spot tests of new offset format %5z."
   (with-time-stamp-test-env
     (let ((utc-abbr (format-time-string "%#Z" ref-time1 t)))
     ;; documented 1995-2019, warned since 2019, will change
@@ -537,10 +540,12 @@
     (let ((time-stamp-time-zone "CET-1"))
       (should (equal (time-stamp-string "%5z" ref-time1) "+0100")))
     ;; implemented since 2019, verify that these don't warn
+    ;; See also the "formatz" tests below, which since 2021 test more
+    ;; variants with more offsets.
     (should (equal (time-stamp-string "%-z" ref-time1) "+00"))
-    (should (equal (time-stamp-string "%_z" ref-time1) "+0000"))
     (should (equal (time-stamp-string "%:z" ref-time1) "+00:00"))
     (should (equal (time-stamp-string "%::z" ref-time1) "+00:00:00"))
+    (should (equal (time-stamp-string "%9::z" ref-time1) "+00:00:00"))
     (should (equal (time-stamp-string "%:::z" ref-time1) "+00"))))
 
 (ert-deftest time-stamp-format-non-date-conversions ()
@@ -586,6 +591,9 @@
      (should (equal (time-stamp-string "%(st(u)ff)B" ref-time3) May))
      ;; escaped parens do not change the nesting level
      (should (equal (time-stamp-string "%(st\\)u\\(ff)B" ref-time3) May))
+     ;; incorrectly nested parens do not crash us
+     (should-not (equal (time-stamp-string "%(stuffB" ref-time3) May))
+     (should-not (equal (time-stamp-string "%)B" ref-time3) May))
      ;; not all punctuation is allowed
      (should-not (equal (time-stamp-string "%&B" ref-time3) May)))))
 
@@ -594,6 +602,41 @@
   (with-time-stamp-test-env
     (should (equal (time-stamp-string "No percent" ref-time1) "No percent"))))
 
+(ert-deftest time-stamp-format-multiple-conversions ()
+  "Tests that multiple %-conversions are independent."
+  (with-time-stamp-test-env
+    (let ((Mon (format-time-string "%a" ref-time1 t))
+          (MON (format-time-string "%^a" ref-time1 t))
+          (Monday (format-time-string "%A" ref-time1 t)))
+      ;; change-case flag is independent
+      (should (equal (time-stamp-string "%a.%#a.%a" ref-time1)
+                     (concat Mon "." MON "." Mon)))
+      ;; up-case flag is independent
+      (should (equal (time-stamp-string "%a.%^a.%a" ref-time1)
+                     (concat Mon "." MON "." Mon)))
+      ;; underscore flag is independent
+      (should (equal (time-stamp-string "%_d.%d.%_d" ref-time1) " 2.02. 2"))
+      (should (equal (time-stamp-string "%_7z.%7z.%_7z" ref-time1)
+                     "+000000.+0000  .+000000"))
+      ;; minus flag is independent
+      (should (equal (time-stamp-string "%d.%-d.%d" ref-time1) "02.2.02"))
+      (should (equal (time-stamp-string "%3z.%-3z.%3z" ref-time1)
+                     "+0000.+00.+0000"))
+      ;; 0 flag is independent
+      (should (equal (time-stamp-string "%2d.%02d.%2d" ref-time1) " 2.02. 2"))
+      (should (equal (time-stamp-string "%6:::z.%06:::z.%6:::z" ref-time1)
+                     "+00   .+00:00.+00   "))
+      ;; field width is independent
+      (should (equal
+               (time-stamp-string "%6Y.%Y.%6Y" ref-time1) "  2006.2006.  
2006"))
+      ;; colon modifier is independent
+      (should (equal (time-stamp-string "%a.%:a.%a" ref-time1)
+                     (concat Mon "." Monday "." Mon)))
+      (should (equal (time-stamp-string "%5z.%5::z.%5z" ref-time1)
+                     "+0000.+00:00:00.+0000"))
+      ;; format letter is independent
+      (should (equal (time-stamp-string "%H:%M" ref-time1) "15:04")))))
+
 (ert-deftest time-stamp-format-string-width ()
   "Test time-stamp string width modifiers."
   (with-time-stamp-test-env
@@ -657,4 +700,401 @@
   (should (safe-local-variable-p 'time-stamp-pattern "a string"))
   (should-not (safe-local-variable-p 'time-stamp-pattern 17)))
 
+;;;; Setup for tests of time offset formatting with %z
+
+(defun formatz (format zone)
+  "Uses time FORMAT string to format the offset of ZONE, returning the result.
+FORMAT is \"%z\" or a variation.
+ZONE is as the ZONE argument of the `format-time-string' function."
+  (with-time-stamp-test-env
+   (let ((time-stamp-time-zone zone))
+     ;; Call your favorite time formatter here.
+     ;; For narrower-scope unit testing,
+     ;; instead of calling time-stamp-string here,
+     ;; we could directly call (format-time-offset format zone)
+     (time-stamp-string format)
+     )))
+
+(defun format-time-offset (format offset-secs)
+  "Uses FORMAT to format the time zone represented by OFFSET-SECS.
+FORMAT must be \"%z\", possibly with a flag and padding.
+This function is a wrapper around `time-stamp-formatz-from-parsed-options'
+and is used for testing."
+  ;; This wrapper adds a simple regexp-based parser that handles only
+  ;; %z and variants.  In normal use, time-stamp-formatz-from-parsed-options
+  ;; is called from a parser that handles all time string formats.
+  (string-match
+   
"\\`\\([^%]*\\)%\\([-_]?\\)\\(0?\\)\\([1-9][0-9]*\\)?\\([EO]?\\)\\(:*\\)\\([^a-zA-Z]+\\)?z\\(.*\\)"
+   format)
+  (let ((leading-string (match-string 1 format))
+        (flag-minimize (seq-find (lambda (x) (eq x ?-))
+                                 (match-string 2 format)))
+        (flag-pad-with-spaces (seq-find (lambda (x) (eq x ?_))
+                                        (match-string 2 format)))
+        (flag-pad-with-zeros (equal (match-string 3 format) "0"))
+        (field-width (string-to-number (or (match-string 4 format) "")))
+        (colon-count (length (match-string 6 format)))
+        (garbage (match-string 7 format))
+        (trailing-string (match-string 8 format)))
+    (concat leading-string
+            (if garbage
+                ""
+              (time-stamp-formatz-from-parsed-options flag-minimize
+                                                      flag-pad-with-spaces
+                                                      flag-pad-with-zeros
+                                                      colon-count
+                                                      field-width
+                                                      offset-secs))
+            trailing-string)))
+
+(defun fz-make+zone (h &optional m s)
+  "Creates a non-negative offset."
+  (let ((m (or m 0))
+        (s (or s 0)))
+    (+ (* 3600 h) (* 60 m) s)))
+
+(defun fz-make-zone (h &optional m s)
+  "Creates a negative offset.  The arguments are all non-negative."
+  (- (fz-make+zone h m s)))
+
+(defmacro formatz-should-equal (zone expect)
+  "Formats ZONE and compares it to EXPECT.
+Uses the free variables `form-string' and `pattern-mod'.
+The functions in `pattern-mod' are composed left to right."
+  `(let ((result ,expect))
+     (dolist (fn pattern-mod)
+       (setq result (funcall fn result)))
+     (should (equal (formatz form-string ,zone) result))))
+
+;; These test cases have zeros in all places (first, last, none, both)
+;; for hours, minutes, and seconds.
+
+(defun formatz-hours-exact-helper (form-string pattern-mod)
+  "Tests format %z with whole hours."
+  (formatz-should-equal (fz-make+zone 0) "+00") ;0 sign always +, both digits
+  (formatz-should-equal (fz-make+zone 10) "+10")
+  (formatz-should-equal (fz-make-zone 10) "-10")
+  (formatz-should-equal (fz-make+zone 2) "+02")
+  (formatz-should-equal (fz-make-zone 2) "-02")
+  (formatz-should-equal (fz-make+zone 13) "+13")
+  (formatz-should-equal (fz-make-zone 13) "-13")
+  )
+
+(defun formatz-nonzero-minutes-helper (form-string pattern-mod)
+  "Tests format %z with whole minutes."
+  (formatz-should-equal (fz-make+zone 0 30) "+00:30") ;has hours even though 0
+  (formatz-should-equal (fz-make-zone 0 30) "-00:30")
+  (formatz-should-equal (fz-make+zone 0 4) "+00:04")
+  (formatz-should-equal (fz-make-zone 0 4) "-00:04")
+  (formatz-should-equal (fz-make+zone 8 40) "+08:40")
+  (formatz-should-equal (fz-make-zone 8 40) "-08:40")
+  (formatz-should-equal (fz-make+zone 0 15) "+00:15")
+  (formatz-should-equal (fz-make-zone 0 15) "-00:15")
+  (formatz-should-equal (fz-make+zone 11 30) "+11:30")
+  (formatz-should-equal (fz-make-zone 11 30) "-11:30")
+  (formatz-should-equal (fz-make+zone 3 17) "+03:17")
+  (formatz-should-equal (fz-make-zone 3 17) "-03:17")
+  (formatz-should-equal (fz-make+zone 12 45) "+12:45")
+  (formatz-should-equal (fz-make-zone 12 45) "-12:45")
+  )
+
+(defun formatz-nonzero-seconds-helper (form-string pattern-mod)
+  "Tests format %z with non-0 seconds."
+  ;; non-0 seconds are always included
+  (formatz-should-equal (fz-make+zone 0 0 50) "+00:00:50")
+  (formatz-should-equal (fz-make-zone 0 0 50) "-00:00:50")
+  (formatz-should-equal (fz-make+zone 0 0 06) "+00:00:06")
+  (formatz-should-equal (fz-make-zone 0 0 06) "-00:00:06")
+  (formatz-should-equal (fz-make+zone 0 7 50) "+00:07:50")
+  (formatz-should-equal (fz-make-zone 0 7 50) "-00:07:50")
+  (formatz-should-equal (fz-make+zone 0 0 16) "+00:00:16")
+  (formatz-should-equal (fz-make-zone 0 0 16) "-00:00:16")
+  (formatz-should-equal (fz-make+zone 0 12 36) "+00:12:36")
+  (formatz-should-equal (fz-make-zone 0 12 36) "-00:12:36")
+  (formatz-should-equal (fz-make+zone 0 3 45) "+00:03:45")
+  (formatz-should-equal (fz-make-zone 0 3 45) "-00:03:45")
+  (formatz-should-equal (fz-make+zone 8 45 30) "+08:45:30")
+  (formatz-should-equal (fz-make-zone 8 45 30) "-08:45:30")
+  (formatz-should-equal (fz-make+zone 0 11 45) "+00:11:45")
+  (formatz-should-equal (fz-make-zone 0 11 45) "-00:11:45")
+  (formatz-should-equal (fz-make+zone 3 20 15) "+03:20:15")
+  (formatz-should-equal (fz-make-zone 3 20 15) "-03:20:15")
+  (formatz-should-equal (fz-make+zone 11 14 30) "+11:14:30")
+  (formatz-should-equal (fz-make-zone 11 14 30) "-11:14:30")
+  (formatz-should-equal (fz-make+zone 12 30 49) "+12:30:49")
+  (formatz-should-equal (fz-make-zone 12 30 49) "-12:30:49")
+  (formatz-should-equal (fz-make+zone 12 0 34) "+12:00:34")
+  (formatz-should-equal (fz-make-zone 12 0 34) "-12:00:34")
+  )
+
+(defun formatz-hours-big-helper (form-string pattern-mod)
+  "Tests format %z with hours that don't fit in two digits."
+  (formatz-should-equal (fz-make+zone 101) "+101:00")
+  (formatz-should-equal (fz-make+zone 123 10) "+123:10")
+  (formatz-should-equal (fz-make-zone 123 10) "-123:10")
+  (formatz-should-equal (fz-make+zone 123 2) "+123:02")
+  (formatz-should-equal (fz-make-zone 123 2) "-123:02")
+  )
+
+(defun formatz-seconds-big-helper (form-string pattern-mod)
+  "Tests format %z with hours greater than 99 and non-zero seconds."
+  (formatz-should-equal (fz-make+zone 123 0 30) "+123:00:30")
+  (formatz-should-equal (fz-make-zone 123 0 30) "-123:00:30")
+  (formatz-should-equal (fz-make+zone 120 0 4) "+120:00:04")
+  (formatz-should-equal (fz-make-zone 120 0 4) "-120:00:04")
+  )
+
+;; Functions that modify the expected output string, so that we can
+;; use the above test cases for multiple formats.
+
+(defun formatz-mod-del-colons (string)
+  "Returns STRING with any colons removed."
+  (replace-regexp-in-string ":" "" string))
+
+(defun formatz-mod-add-00 (string)
+  "Returns STRING with \"00\" appended."
+  (concat string "00"))
+
+(defun formatz-mod-add-colon00 (string)
+  "Returns STRING with \":00\" appended."
+  (concat string ":00"))
+
+(defun formatz-mod-pad-r10 (string)
+  "Returns STRING padded on the right to 10 characters."
+  (concat string (make-string (- 10 (length string)) ?\s)))
+
+(defun formatz-mod-pad-r12 (string)
+  "Returns STRING padded on the right to 12 characters."
+  (concat string (make-string (- 12 (length string)) ?\s)))
+
+;; Convenience macro for generating groups of test cases.
+
+(defmacro formatz-generate-tests
+    (form-strings hour-mod mins-mod secs-mod big-mod secbig-mod)
+  "Defines ert-deftest tests for time formats FORM-STRINGS.
+FORM-STRINGS is a list of formats, each \"%z\" or some variation thereof.
+
+Each of the remaining arguments is an unquoted list of the form
+(SAMPLE-OUTPUT . MODIFIERS).  SAMPLE-OUTPUT is the result of the
+FORM-STRINGS for a particular offset, detailed below for each argument.
+The remaining elements of the list, the MODIFIERS, are the names of
+functions to modify the expected results for sets of tests.
+The MODIFIERS do not modify the SAMPLE-OUTPUT.
+
+The one, literal sample output is given in the call to this macro
+to provide a visual check at the call site that the format
+behaves as expected.
+
+HOUR-MOD is the result for offset 0 and modifiers for the other
+expected results for whole hours.
+MINS-MOD is the result for offset +30 minutes and modifiers for the
+other expected results for whole minutes.
+SECS-MOD is the result for offset +30 seconds and modifiers for the
+other expected results for offsets with non-zero seconds.
+BIG-MOD is the result for offset +100 hours and modifiers for the other
+expected results for hours greater than 99 with a whole number of minutes.
+SECBIG-MOD is the result for offset +100 hours 30 seconds and modifiers for
+the other expected results for hours greater than 99 with non-zero seconds."
+  (declare (indent 1))
+  ;; Generate a form to create a list of tests to define.  When this
+  ;; macro is called, the form is evaluated, thus defining the tests.
+  (let ((ert-test-list '(list)))
+    (dolist (form-string form-strings ert-test-list)
+      (nconc
+       ert-test-list
+       (list
+        `(ert-deftest ,(intern (concat "formatz-" form-string "-hhmm")) ()
+           (should (equal (formatz ,form-string (fz-make+zone 0))
+                          ,(car hour-mod)))
+           (formatz-hours-exact-helper ,form-string ',(cdr hour-mod))
+           (should (equal (formatz ,form-string (fz-make+zone 0 30))
+                          ,(car mins-mod)))
+           (formatz-nonzero-minutes-helper ,form-string ',(cdr mins-mod)))
+        `(ert-deftest ,(intern (concat "formatz-" form-string "-secs")) ()
+           (should (equal (formatz ,form-string (fz-make+zone 0 0 30))
+                          ,(car secs-mod)))
+           (formatz-nonzero-seconds-helper ,form-string ',(cdr secs-mod)))
+        `(ert-deftest ,(intern (concat "formatz-" form-string "-big")) ()
+           (should (equal (formatz ,form-string (fz-make+zone 100))
+                          ,(car big-mod)))
+           (formatz-hours-big-helper ,form-string ',(cdr big-mod))
+           (should (equal (formatz ,form-string (fz-make+zone 100 0 30))
+                          ,(car secbig-mod)))
+           (formatz-seconds-big-helper ,form-string ',(cdr secbig-mod)))
+        )))))
+
+;;;; The actual test cases for %z
+
+;;; %z formats without colons.
+
+;; Option character "-" (minus) minimizes; it removes "00" minutes.
+(formatz-generate-tests ("%-z" "%-3z")
+  ("+00")
+  ("+0030" formatz-mod-del-colons)
+  ("+000030" formatz-mod-del-colons)
+  ("+100:00")
+  ("+100:00:30"))
+;; Tests that minus with padding pads with spaces.
+(formatz-generate-tests ("%-12z")
+  ("+00         " formatz-mod-pad-r12)
+  ("+0030       " formatz-mod-del-colons formatz-mod-pad-r12)
+  ("+000030     " formatz-mod-del-colons formatz-mod-pad-r12)
+  ("+100:00     " formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+;; Tests that 0 after other digits becomes padding of ten, not zero flag.
+(formatz-generate-tests ("%-10z")
+  ("+00       " formatz-mod-pad-r10)
+  ("+0030     " formatz-mod-del-colons formatz-mod-pad-r10)
+  ("+000030   " formatz-mod-del-colons formatz-mod-pad-r10)
+  ("+100:00   " formatz-mod-pad-r10)
+  ("+100:00:30"))
+
+;; Although time-stamp doesn't call us for %z, we do want to spot-check
+;; it here, to verify the implementation we will eventually use.
+;; The legacy exception for %z in time-stamp will need to remain
+;; through at least 2024 and Emacs 28.
+(ert-deftest formatz-%z-spotcheck ()
+  (should (equal (format-time-offset "%z" (fz-make+zone 0)) "+0000"))
+  (should (equal (format-time-offset "%z" (fz-make+zone 0 30)) "+0030"))
+  (should (equal (format-time-offset "%z" (fz-make+zone 0 0 30)) "+000030"))
+  (should (equal (format-time-offset "%z" (fz-make+zone 100)) "+100:00"))
+  (should (equal (format-time-offset "%z" (fz-make+zone 100 0 30)) 
"+100:00:30"))
+  )
+
+;; Basic %z outputs 4 digits.
+;; Small padding values do not extend the result.
+(formatz-generate-tests (;; We don't check %z here because time-stamp
+                         ;; has a legacy behavior for it.
+                         ;;"%z"
+                         "%5z" "%0z" "%05z")
+  ("+0000" formatz-mod-add-00)
+  ("+0030" formatz-mod-del-colons)
+  ("+000030" formatz-mod-del-colons)
+  ("+100:00")
+  ("+100:00:30"))
+
+;; Tests that padding adds spaces.
+(formatz-generate-tests ("%12z")
+  ("+0000       " formatz-mod-add-00 formatz-mod-pad-r12)
+  ("+0030       " formatz-mod-del-colons formatz-mod-pad-r12)
+  ("+000030     " formatz-mod-del-colons formatz-mod-pad-r12)
+  ("+100:00     " formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+
+;; Requiring 0-padding to 6 adds seconds (only) as needed.
+(formatz-generate-tests ("%06z")
+  ("+000000" formatz-mod-add-00 formatz-mod-add-00)
+  ("+003000" formatz-mod-del-colons formatz-mod-add-00)
+  ("+000030" formatz-mod-del-colons)
+  ("+100:00")
+  ("+100:00:30"))
+
+;; Option character "_" always adds seconds.
+(formatz-generate-tests ("%_z" "%_7z")
+  ("+000000" formatz-mod-add-00 formatz-mod-add-00)
+  ("+003000" formatz-mod-del-colons formatz-mod-add-00)
+  ("+000030" formatz-mod-del-colons)
+  ("+100:00:00" formatz-mod-add-colon00)
+  ("+100:00:30"))
+
+;; Enough 0-padding adds seconds, then adds spaces.
+(formatz-generate-tests ("%012z" "%_12z")
+  ("+000000     " formatz-mod-add-00 formatz-mod-add-00 formatz-mod-pad-r12)
+  ("+003000     " formatz-mod-del-colons formatz-mod-add-00 
formatz-mod-pad-r12)
+  ("+000030     " formatz-mod-del-colons formatz-mod-pad-r12)
+  ("+100:00:00  " formatz-mod-add-colon00 formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+
+;;; %z formats with colons
+
+;; Three colons can output hours only,
+;; like %-z, but uses colons with non-zero minutes and seconds.
+(formatz-generate-tests ("%:::z" "%0:::z"
+                         "%3:::z" "%03:::z")
+  ("+00")
+  ("+00:30")
+  ("+00:00:30")
+  ("+100:00")
+  ("+100:00:30"))
+
+;; Padding with three colons adds spaces
+(formatz-generate-tests ("%12:::z")
+  ("+00         " formatz-mod-pad-r12)
+  ("+00:30      " formatz-mod-pad-r12)
+  ("+00:00:30   " formatz-mod-pad-r12)
+  ("+100:00     " formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+;; Tests that 0 after other digits becomes padding of ten, not zero flag.
+(formatz-generate-tests ("%10:::z")
+  ("+00       " formatz-mod-pad-r10)
+  ("+00:30    " formatz-mod-pad-r10)
+  ("+00:00:30 " formatz-mod-pad-r10)
+  ("+100:00   " formatz-mod-pad-r10)
+  ("+100:00:30"))
+
+;; One colon outputs minutes, like %z but with colon.
+(formatz-generate-tests ("%:z" "%6:z" "%0:z" "%06:z" "%06:::z")
+  ("+00:00" formatz-mod-add-colon00)
+  ("+00:30")
+  ("+00:00:30")
+  ("+100:00")
+  ("+100:00:30"))
+
+;; Padding with one colon adds spaces
+(formatz-generate-tests ("%12:z")
+  ("+00:00      " formatz-mod-add-colon00 formatz-mod-pad-r12)
+  ("+00:30      " formatz-mod-pad-r12)
+  ("+00:00:30   " formatz-mod-pad-r12)
+  ("+100:00     " formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+
+;; Requiring 0-padding to 7 adds seconds (only) as needed.
+(formatz-generate-tests ("%07:z" "%07:::z")
+  ("+00:00:00" formatz-mod-add-colon00 formatz-mod-add-colon00)
+  ("+00:30:00" formatz-mod-add-colon00)
+  ("+00:00:30")
+  ("+100:00")
+  ("+100:00:30"))
+
+;; Two colons outputs HH:MM:SS, like %_z but with colons.
+(formatz-generate-tests ("%::z" "%9::z" "%0::z" "%09::z")
+  ("+00:00:00" formatz-mod-add-colon00 formatz-mod-add-colon00)
+  ("+00:30:00" formatz-mod-add-colon00)
+  ("+00:00:30")
+  ("+100:00:00" formatz-mod-add-colon00)
+  ("+100:00:30"))
+
+;; Enough padding adds minutes and seconds, then adds spaces.
+(formatz-generate-tests ("%012:z" "%012::z" "%12::z" "%012:::z")
+  ("+00:00:00   " formatz-mod-add-colon00 formatz-mod-add-colon00
+                  formatz-mod-pad-r12)
+  ("+00:30:00   " formatz-mod-add-colon00 formatz-mod-pad-r12)
+  ("+00:00:30   " formatz-mod-pad-r12)
+  ("+100:00:00  " formatz-mod-add-colon00 formatz-mod-pad-r12)
+  ("+100:00:30  " formatz-mod-pad-r12))
+
+;;; Illegal %z formats
+
+(ert-deftest formatz-illegal-options ()
+  "Tests that illegal/nonsensical/ambiguous %z formats don't produce output."
+  ;; multiple options
+  (should (equal "" (formatz "%_-z" 0)))
+  (should (equal "" (formatz "%-_z" 0)))
+  (should (equal "" (formatz "%_0z" 0)))
+  (should (equal "" (formatz "%0_z" 0)))
+  (should (equal "" (formatz "%0-z" 0)))
+  (should (equal "" (formatz "%-0z" 0)))
+  ;; inconsistent to both minimize and require mins or secs
+  (should (equal "" (formatz "%-:z" 0)))
+  (should (equal "" (formatz "%-::z" 0)))
+  ;; consistent, but redundant
+  (should (equal "" (formatz "%-:::z" 0)))
+  (should (equal "" (formatz "%_::z" 0)))
+  ;; inconsistent to both pre-expand and default to hours or mins
+  (should (equal "" (formatz "%_:::z" 0)))
+  (should (equal "" (formatz "%_:z" 0)))
+  ;; options that don't make sense with %z
+  (should (equal "" (formatz "%#z" 0)))
+  )
+
 ;;; time-stamp-tests.el ends here
diff --git a/test/lisp/vc/diff-mode-tests.el b/test/lisp/vc/diff-mode-tests.el
index f4e5c89..5bc4ad6 100644
--- a/test/lisp/vc/diff-mode-tests.el
+++ b/test/lisp/vc/diff-mode-tests.el
@@ -203,6 +203,148 @@ youthfulness
           (kill-buffer buf2)
           (delete-directory temp-dir 'recursive))))))
 
+(ert-deftest diff-mode-test-hunk-text-no-newline ()
+  "Check output of `diff-hunk-text' with no newline at end of file."
+
+  ;; First check unified change/remove/add cases with newline
+  (let ((hunk "\
+@@ -1 +1 @@
+-foo
++bar
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+")))
+
+  (let ((hunk "\
+@@ -1 +0,0 @@
+-foo
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+")))
+
+  (let ((hunk "\
+@@ -0,0 +1 @@
++bar
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+")))
+
+  ;; Check unified change/remove cases with no newline in old file
+  (let ((hunk "\
+@@ -1 +1 @@
+-foo
+\\ No newline at end of file
++bar
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+")))
+
+  (let ((hunk "\
+@@ -1 +0,0 @@
+-foo
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+")))
+
+  ;; Check unified change/add cases with no newline in new file
+  (let ((hunk "\
+@@ -1 +1 @@
+-foo
++bar
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar")))
+
+  (let ((hunk "\
+@@ -0,0 +1 @@
++bar
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar")))
+
+  ;; Check unified change case with no newline in both old/new file
+  (let ((hunk "\
+@@ -1 +1 @@
+-foo
+\\ No newline at end of file
++bar
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar")))
+
+  ;; Check context-after unified change case with no newline in both old/new 
file
+  (let ((hunk "\
+@@ -1,2 +1,2 @@
+-foo
++bar
+ baz
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+baz"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+baz")))
+
+  (let ((hunk "\
+@@ -1,2 +1,2 @@
+-foo
+-baz
+\\ No newline at end of file
++bar
++baz
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+baz"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+baz
+")))
+
+  (let ((hunk "\
+@@ -1,2 +1,2 @@
+-foo
+-baz
++bar
++baz
+\\ No newline at end of file
+"))
+    (should (equal (diff-hunk-text hunk nil nil) "\
+foo
+baz
+"))
+    (should (equal (diff-hunk-text hunk t nil) "\
+bar
+baz"))))
+
 (ert-deftest diff-mode-test-font-lock ()
   "Check font-locking of diff hunks."
   ;; See comments in diff-hunk-file-names about nonascii.
diff --git a/test/manual/etags/CTAGS.good b/test/manual/etags/CTAGS.good
index 5e58243..84a56b2 100644
--- a/test/manual/etags/CTAGS.good
+++ b/test/manual/etags/CTAGS.good
@@ -759,6 +759,7 @@ Install_Abort_Handler/p     ada-src/2ataspri.ads    /^   
procedure Install_Abort_Handle
 Install_Error_Handler/p        ada-src/2ataspri.adb    /^   procedure 
Install_Error_Handler (Handler : Syst/
 Install_Error_Handler/p        ada-src/2ataspri.ads    /^   procedure 
Install_Error_Handler (Handler : Syst/
 Invoking gzip  tex-src/gzip.texi       /^@node Invoking gzip, Advanced usage, 
Sample, Top$/
+IpAddrKind     rs-src/test.rs  3
 IsControlChar  pas-src/common.pas      /^function IsControlChar; (*($/
 IsControlCharName      pas-src/common.pas      /^function IsControlCharName($/
 Is_Set/f       ada-src/2ataspri.adb    /^   function  Is_Set (Cell : in 
TAS_Cell) return Bo/
@@ -984,6 +985,7 @@ MoveLayerBottom     lua-src/allegro.lua     /^function 
MoveLayerBottom ()$/
 MoveLayerTop   lua-src/allegro.lua     /^function MoveLayerTop ()$/
 Mtest.go       go-src/test.go  1
 Mtest.go       go-src/test.go  /^func main() {$/
+Mtest.rs       rs-src/test.rs  /^fn main() {$/
 Mtest1.go      go-src/test1.go 1
 Mtest1.go      go-src/test1.go /^func main() {$/
 Mx.cc  cp-src/x.cc     /^main(int argc, char *argv[])$/
@@ -1153,7 +1155,6 @@ Python_help       c-src/etags.c   660
 Python_suffixes        c-src/etags.c   658
 QUIT   c-src/emacs/src/lisp.h  3101
 QUITP  c-src/emacs/src/lisp.h  3112
-Qpre_abbrev_expand_hook        c-src/abbrev.c  83
 RANGED_INTEGERP        c-src/emacs/src/lisp.h  /^RANGED_INTEGERP (intmax_t lo, 
Lisp_Object x, intma/
 RCSid  objc-src/PackInsp.m     30
 READABLE_EVENTS_DO_TIMERS_NOW  c-src/emacs/src/keyboard.c      346
@@ -1498,7 +1499,6 @@ Vglobal_abbrev_table      c-src/abbrev.c  48
 Vlast_abbrev   c-src/abbrev.c  70
 Vlast_abbrev_text      c-src/abbrev.c  75
 Vlispy_mouse_stem      c-src/emacs/src/keyboard.c      5172
-Vpre_abbrev_expand_hook        c-src/abbrev.c  83
 WAIT_READING_MAX       c-src/emacs/src/lisp.h  4281
 WAIT_READING_MAX       c-src/emacs/src/lisp.h  4283
 WARNINGS       make-src/Makefile       /^WARNINGS=-pedantic -Wall 
-Wpointer-arith -Winline /
@@ -1732,7 +1732,6 @@ Z c-src/h.h       100
 \1     c-src/abbrev.c  /^  DEFVAR_PER_BUFFER ("local-abbrev-table", &curren/
 \1     c-src/abbrev.c  /^  DEFVAR_BOOL ("abbrevs-changed", &abbrevs_changed/
 \1     c-src/abbrev.c  /^  DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps/
-\1     c-src/abbrev.c  /^  DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abb/
 \1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("internal--top-level-message", Vint/
 \1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-command-event", 
last_command_/
 \1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-nonmenu-event", 
last_nonmenu_/
@@ -2462,8 +2461,47 @@ abs/f    ada-src/etags-test-for.ada      /^   function 
"abs"   (Right : Complex) return
 absolute_dirname       c-src/etags.c   /^absolute_dirname (char *file, char 
*dir)$/
 absolute_filename      c-src/etags.c   /^absolute_filename (char *file, char 
*dir)$/
 abt    cp-src/c.C      55
+acc_pred_info  merc-src/accumulator.m  /^:- pred 
acc_pred_info(list(mer_type)::in, list(pro/
+acc_proc_info  merc-src/accumulator.m  /^:- pred 
acc_proc_info(list(prog_var)::in, prog_var/
+acc_unification        merc-src/accumulator.m  /^:- pred 
acc_unification(pair(prog_var)::in, hlds_g/
+acc_var_subst_init     merc-src/accumulator.m  /^:- pred 
acc_var_subst_init(list(prog_var)::in,$/
 accent_key_syms        c-src/emacs/src/keyboard.c      4625
 access_keymap_keyremap c-src/emacs/src/keyboard.c      
/^access_keymap_keyremap (Lisp_Object map, Lisp_Obje/
+accu_assoc     merc-src/accumulator.m  /^:- pred accu_assoc(module_info::in, 
vartypes::in, /
+accu_assoc     merc-src/accumulator.m  /^:- type accu_assoc$/
+accu_base      merc-src/accumulator.m  /^:- type accu_base$/
+accu_before    merc-src/accumulator.m  /^:- pred accu_before(module_info::in, 
vartypes::in,/
+accu_case      merc-src/accumulator.m  /^:- type accu_case$/
+accu_construct merc-src/accumulator.m  /^:- pred 
accu_construct(module_info::in, vartypes::/
+accu_construct_assoc   merc-src/accumulator.m  /^:- pred 
accu_construct_assoc(module_info::in, vart/
+accu_create_goal       merc-src/accumulator.m  /^:- pred 
accu_create_goal(accu_goal_id::in, list(pr/
+accu_divide_base_case  merc-src/accumulator.m  /^:- pred 
accu_divide_base_case(module_info::in, var/
+accu_goal_id   merc-src/accumulator.m  /^:- type accu_goal_id$/
+accu_goal_list merc-src/accumulator.m  /^:- func 
accu_goal_list(list(accu_goal_id), accu_go/
+accu_goal_store        merc-src/accumulator.m  /^:- type accu_goal_store == 
goal_store(accu_goal_id/
+accu_has_heuristic     merc-src/accumulator.m  /^:- pred 
accu_has_heuristic(module_name::in, string/
+accu_heuristic merc-src/accumulator.m  /^:- pred 
accu_heuristic(module_name::in, string::in/
+accu_is_associative    merc-src/accumulator.m  /^:- pred 
accu_is_associative(module_info::in, pred_/
+accu_is_update merc-src/accumulator.m  /^:- pred 
accu_is_update(module_info::in, pred_id::i/
+accu_process_assoc_set merc-src/accumulator.m  /^:- pred 
accu_process_assoc_set(module_info::in, ac/
+accu_process_update_set        merc-src/accumulator.m  /^:- pred 
accu_process_update_set(module_info::in, a/
+accu_related   merc-src/accumulator.m  /^:- pred accu_related(module_info::in, 
vartypes::in/
+accu_rename    merc-src/accumulator.m  /^:- func 
accu_rename(list(accu_goal_id), accu_subst/
+accu_sets      merc-src/accumulator.m  /^:- type accu_sets$/
+accu_sets_init merc-src/accumulator.m  /^:- pred 
accu_sets_init(accu_sets::out) is det.$/
+accu_stage1    merc-src/accumulator.m  /^:- pred accu_stage1(module_info::in, 
vartypes::in,/
+accu_stage1_2  merc-src/accumulator.m  /^:- pred 
accu_stage1_2(module_info::in, vartypes::i/
+accu_stage2    merc-src/accumulator.m  /^:- pred accu_stage2(module_info::in, 
proc_info::in/
+accu_stage3    merc-src/accumulator.m  /^:- pred accu_stage3(accu_goal_id::in, 
list(prog_va/
+accu_standardize       merc-src/accumulator.m  /^:- pred 
accu_standardize(hlds_goal::in, hlds_goal:/
+accu_store     merc-src/accumulator.m  /^:- pred accu_store(accu_case::in, 
hlds_goal::in,$/
+accu_subst     merc-src/accumulator.m  /^:- type accu_subst == map(prog_var, 
prog_var).$/
+accu_substs    merc-src/accumulator.m  /^:- type accu_substs$/
+accu_substs_init       merc-src/accumulator.m  /^:- pred 
accu_substs_init(list(prog_var)::in, prog_/
+accu_top_level merc-src/accumulator.m  /^:- pred accu_top_level(top_level::in, 
hlds_goal::i/
+accu_transform_proc    merc-src/accumulator.m  /^:- pred 
accu_transform_proc(pred_proc_id::in, pred/
+accu_update    merc-src/accumulator.m  /^:- pred accu_update(module_info::in, 
vartypes::in,/
+accu_warning   merc-src/accumulator.m  /^:- type accu_warning$/
 act    prol-src/natded.prolog  /^act(OutForm,OutSyn,Ws):-$/
 action prol-src/natded.prolog  /^action(KeyVals):-$/
 active_maps    c-src/emacs/src/keyboard.c      /^active_maps (Lisp_Object 
first_event)$/
@@ -2535,6 +2573,8 @@ assemby-code-word forth-src/test-forth.fth        /^code 
assemby-code-word ( dunno what
 assert c-src/etags.c   135
 assert c-src/etags.c   /^# define assert(x) ((void) 0)$/
 assign_neighbor        cp-src/clheir.hpp       /^    void assign_neighbor(int 
direction, location */
+assoc_list     merc-src/accumulator.m  /^:- import_module assoc_list.$/
+associativity_assertion        merc-src/accumulator.m  /^:- pred 
associativity_assertion(module_info::in, l/
 at_end c-src/etags.c   249
 at_filename    c-src/etags.c   247
 at_language    c-src/etags.c   245
@@ -2568,6 +2608,8 @@ bas_syn   prol-src/natded.prolog  /^bas_syn(n(_)).$/
 base   c-src/emacs/src/lisp.h  2188
 base   cp-src/c.C      /^double base (void) const { return rng_base;  }$/
 base   cp-src/Range.h  /^  double base (void) const { return rng_base;  }$/
+base_case_ids  merc-src/accumulator.m  /^:- func 
base_case_ids(accu_goal_store) = list(accu/
+base_case_ids_set      merc-src/accumulator.m  /^:- func 
base_case_ids_set(accu_goal_store) = set(a/
 baz=   ruby-src/test1.ru       /^                :baz,$/
 bb     c.c     275
 bbb    c.c     251
@@ -2605,6 +2647,7 @@ bodyindent        tex-src/texinfo.tex     
/^\\exdentamount=\\defbodyindent$/
 bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
 bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
 bool   c.c     222
+bool   merc-src/accumulator.m  /^:- import_module bool.$/
 bool_header_size       c-src/emacs/src/lisp.h  1472
 bool_vector_bitref     c-src/emacs/src/lisp.h  /^bool_vector_bitref 
(Lisp_Object a, EMACS_INT i)$/
 bool_vector_bytes      c-src/emacs/src/lisp.h  /^bool_vector_bytes (EMACS_INT 
size)$/
@@ -2646,6 +2689,7 @@ c_ext     c-src/etags.c   2271
 caccacacca     c.c     /^caccacacca (a,b,c,d,e,f,g)$/
 cacheLRUEntry_s        c.c     172
 cacheLRUEntry_t        c.c     177
+calculate_goal_info    merc-src/accumulator.m  /^:- pred 
calculate_goal_info(hlds_goal_expr::in, hl/
 calloc c-src/emacs/src/gmalloc.c       66
 calloc c-src/emacs/src/gmalloc.c       70
 calloc c-src/emacs/src/gmalloc.c       /^calloc (size_t nmemb, size_t size)$/
@@ -2666,6 +2710,8 @@ cgrep     html-src/software.html  /^cgrep$/
 chain  c-src/emacs/src/lisp.h  1162
 chain  c-src/emacs/src/lisp.h  2206
 chain  c-src/emacs/src/lisp.h  2396
+chain_subst    merc-src/accumulator.m  /^:- func chain_subst(accu_subst, 
accu_subst) = accu/
+chain_subst_2  merc-src/accumulator.m  /^:- pred chain_subst_2(list(A)::in, 
map(A, B)::in, /
 char_bits      c-src/emacs/src/lisp.h  2443
 char_table_specials    c-src/emacs/src/lisp.h  1692
 charpos        c-src/emacs/src/lisp.h  2011
@@ -2708,6 +2754,7 @@ command_loop_1    c-src/emacs/src/keyboard.c      
/^command_loop_1 (void)$/
 command_loop_2 c-src/emacs/src/keyboard.c      /^command_loop_2 (Lisp_Object 
ignore)$/
 command_loop_level     c-src/emacs/src/keyboard.c      195
 comment        php-src/lce_functions.php       /^      function comment($line, 
$class)$/
+commutativity_assertion        merc-src/accumulator.m  /^:- pred 
commutativity_assertion(module_info::in,li/
 compile_empty  prol-src/natded.prolog  /^compile_empty:-$/
 compile_lex    prol-src/natded.prolog  /^compile_lex(File):-$/
 complete       prol-src/natded.prolog  /^complete(Cat):-$/
@@ -2741,6 +2788,13 @@ create-bar       forth-src/test-forth.fth        /^: 
create-bar foo ;$/
 createPOEntries        php-src/lce_functions.php       /^      function 
createPOEntries()$/
 createWidgets  pyt-src/server.py       /^    def createWidgets(self, host):$/
 createWidgets  pyt-src/server.py       /^    def createWidgets(self):$/
+create_acc_call        merc-src/accumulator.m  /^:- func 
create_acc_call(hlds_goal::in(goal_plain_c/
+create_acc_goal        merc-src/accumulator.m  /^:- pred 
create_acc_goal(hlds_goal::in, accu_substs/
+create_new_base_goals  merc-src/accumulator.m  /^:- func 
create_new_base_goals(set(accu_goal_id), a/
+create_new_orig_recursive_goals        merc-src/accumulator.m  /^:- func 
create_new_orig_recursive_goals(set(accu_g/
+create_new_recursive_goals     merc-src/accumulator.m  /^:- func 
create_new_recursive_goals(set(accu_goal_i/
+create_new_var merc-src/accumulator.m  /^:- pred create_new_var(prog_var::in, 
string::in, p/
+create_orig_goal       merc-src/accumulator.m  /^:- pred 
create_orig_goal(hlds_goal::in, accu_subst/
 cscInitTime    cp-src/c.C      7
 cscSegmentationTime    cp-src/c.C      8
 cstack c-src/etags.c   2523
@@ -3048,6 +3102,7 @@ foperator c-src/etags.c   2411
 force_auto_save_soon   c-src/emacs/src/keyboard.c      /^force_auto_save_soon 
(void)$/
 force_explicit_name    c-src/etags.c   265
 force_quit_count       c-src/emacs/src/keyboard.c      10387
+foreign_export merc-src/accumulator.m  /^:- pragma foreign_export("C", 
unravel_univ(in, out/
 formatSize     objc-src/PackInsp.m     /^-(const char *)formatSize:(const char 
*)size inBuf/
 found  c-src/emacs/src/lisp.h  2344
 fracas html-src/software.html  /^Fracas$/
@@ -3105,6 +3160,8 @@ gcpro     c-src/emacs/src/lisp.h  3042
 gcpro  c-src/emacs/src/lisp.h  3132
 gen_help_event c-src/emacs/src/keyboard.c      /^gen_help_event (Lisp_Object 
help, Lisp_Object fram/
 genalgorithm   html-src/algrthms.html  /^Generating the 
Data<\/font><\/i><\/b>$/
+generate_warning       merc-src/accumulator.m  /^:- pred 
generate_warning(module_info::in, prog_var/
+generate_warnings      merc-src/accumulator.m  /^:- pred 
generate_warnings(module_info::in, prog_va/
 generic_object cp-src/clheir.cpp       /^generic_object::generic_object(void)$/
 generic_object cp-src/clheir.hpp       13
 getArchs       objc-src/PackInsp.m     /^-(void)getArchs$/
@@ -3173,6 +3230,7 @@ help_char_p       c-src/emacs/src/keyboard.c      
/^help_char_p (Lisp_Object c)$/
 help_form_saved_window_configs c-src/emacs/src/keyboard.c      2156
 helpwin        pyt-src/server.py       /^def helpwin(helpdict):$/
 hide_cursor    cp-src/screen.cpp       /^void hide_cursor(void)$/
+hlds   merc-src/accumulator.m  /^:- import_module hlds.$/
 htmltreelist   prol-src/natded.prolog  /^htmltreelist([]).$/
 hybrid_aligned_alloc   c-src/emacs/src/gmalloc.c       /^hybrid_aligned_alloc 
(size_t alignment, size_t siz/
 hybrid_calloc  c-src/emacs/src/gmalloc.c       /^hybrid_calloc (size_t nmemb, 
size_t size)$/
@@ -3192,12 +3250,16 @@ ialpage tex-src/texinfo.tex     /^  
\\dimen@=\\pageheight \\advance\\dimen@ by-\\ht\
 ialpage        tex-src/texinfo.tex     /^  \\availdimen@=\\pageheight 
\\advance\\availdimen@ by/
 ialpage        tex-src/texinfo.tex     /^     \\dimen@=\\pageheight 
\\advance\\dimen@ by-\\ht\\pa/
 ialpage=       tex-src/texinfo.tex     /^  
\\output={\\global\\setbox\\partialpage=$/
+identify_goal_type     merc-src/accumulator.m  /^:- pred 
identify_goal_type(pred_id::in, proc_id::i/
+identify_out_and_out_prime     merc-src/accumulator.m  /^:- pred 
identify_out_and_out_prime(module_info::in/
+identify_recursive_calls       merc-src/accumulator.m  /^:- pred 
identify_recursive_calls(pred_id::in, proc/
 idx    c-src/emacs/src/lisp.h  3150
 ignore_case    c-src/etags.c   266
 ignore_mouse_drag_p    c-src/emacs/src/keyboard.c      1256
 ill=\relax     tex-src/texinfo.tex     /^\\let\\refill=\\relax$/
 immediate_quit c-src/emacs/src/keyboard.c      174
 impatto        html-src/softwarelibero.html    /^Impatto pratico del software 
libero$/
+implementation merc-src/accumulator.m  /^:- implementation.$/
 in_word_set    c-src/etags.c   /^in_word_set (register const char *str, 
register un/
 inattribute    c-src/etags.c   2400
 inc    cp-src/Range.h  /^  double inc (void) const { return rng_inc;   }$/
@@ -3221,6 +3283,7 @@ inita     c.c     /^static void inita () {}$/
 initb  c.c     /^static void initb () {}$/
 initial_kboard c-src/emacs/src/keyboard.c      84
 initialize-new-tags-table      el-src/emacs/lisp/progmodes/etags.el    
/^(defun initialize-new-tags-table ()$/
+initialize_goal_store  merc-src/accumulator.m  /^:- func 
initialize_goal_store(list(hlds_goal), ins/
 initialize_random_junk y-src/cccp.y    /^initialize_random_junk ()$/
 input-pending-p        c-src/emacs/src/keyboard.c      /^DEFUN 
("input-pending-p", Finput_pending_p, Sinput/
 input_available_clear_time     c-src/emacs/src/keyboard.c      324
@@ -3236,6 +3299,7 @@ instance_method_exclamation!      ruby-src/test.rb        
/^        def instance_method_excl
 instance_method_question?      ruby-src/test.rb        /^        def 
instance_method_question?$/
 instr  y-src/parse.y   81
 instruct       c-src/etags.c   2527
+int    merc-src/accumulator.m  /^:- import_module int.$/
 intNumber      go-src/test1.go 13
 integer        c-src/emacs/src/lisp.h  2127
 integer        y-src/cccp.y    112
@@ -3244,6 +3308,7 @@ integertonmstr    pas-src/common.pas      /^function 
integertonmstr; (* (TheInteger : in
 intensity1     f-src/entry.for /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
 intensity1     f-src/entry.strange_suffix      /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
 intensity1     f-src/entry.strange     /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+interface      merc-src/accumulator.m  /^:- interface.$/
 interface_locate       c-src/c.c       /^interface_locate(void)$/
 intern c-src/emacs/src/lisp.h  /^intern (const char *str)$/
 intern_c_string        c-src/emacs/src/lisp.h  /^intern_c_string (const char 
*str)$/
@@ -3258,6 +3323,7 @@ intoken   c-src/etags.c   /^#define       intoken(c)      
(_itk[CHAR (c)]) \/* c can be in/
 intspec        c-src/emacs/src/lisp.h  1688
 intvar c-src/emacs/src/lisp.h  2277
 invalidate_nodes       c-src/etags.c   /^invalidate_nodes (fdesc *badfdp, node 
**npp)$/
+io     merc-src/accumulator.m  /^:- import_module io.$/
 ipc3dCSC19     cp-src/c.C      6
 ipc3dChannelType       cp-src/c.C      1
 ipc3dIslandHierarchy   cp-src/c.C      1
@@ -3267,6 +3333,7 @@ irregular_location        cp-src/clheir.hpp       /^    
irregular_location(double xi, double
 isComment      php-src/lce_functions.php       /^      function 
isComment($class)$/
 isHoliday      cp-src/functions.cpp    /^bool isHoliday ( Date d ){$/
 isLeap cp-src/functions.cpp    /^bool isLeap ( int year ){$/
+is_associative_construction    merc-src/accumulator.m  /^:- pred 
is_associative_construction(module_info::i/
 is_curly_brace_form    c-src/h.h       54
 is_explicit    c-src/h.h       49
 is_func        c-src/etags.c   221
@@ -3275,6 +3342,7 @@ is_idchar y-src/cccp.y    948
 is_idstart     y-src/cccp.y    950
 is_muldiv_operation    cp-src/c.C      /^is_muldiv_operation(pc)$/
 is_ordset      prol-src/ordsets.prolog /^is_ordset(X) :- var(X), !, fail.$/
+is_recursive_case      merc-src/accumulator.m  /^:- pred 
is_recursive_case(list(hlds_goal)::in, pre/
 iso_lispy_function_keys        c-src/emacs/src/keyboard.c      5151
 isoperator     prol-src/natded.prolog  /^isoperator(Char):-$/
 isoptab        prol-src/natded.prolog  /^isoptab('%').$/
@@ -3371,6 +3439,7 @@ letter:   tex-src/texinfo.tex     
/^\\xdef\\thischapter{Appendix \\appendixletter: \\n
 level  c-src/emacs/src/lisp.h  3153
 lex    prol-src/natded.prolog  /^lex(W,SynOut,Sem):-$/
 lexptr y-src/cccp.y    332
+libs   merc-src/accumulator.m  /^:- import_module libs.$/
 licenze        html-src/softwarelibero.html    /^Licenze d'uso di un 
programma$/
 limit  cp-src/Range.h  /^  double limit (void) const { return rng_limit; }$/
 line   c-src/etags.c   2493
@@ -3428,6 +3497,7 @@ lispy_modifier_list       c-src/emacs/src/keyboard.c      
/^lispy_modifier_list (int modifi
 lispy_multimedia_keys  c-src/emacs/src/keyboard.c      4962
 lispy_wheel_names      c-src/emacs/src/keyboard.c      5174
 list   c-src/emacs/src/gmalloc.c       186
+list   merc-src/accumulator.m  /^:- import_module list.$/
 list-tags      el-src/emacs/lisp/progmodes/etags.el    /^(defun list-tags 
(file &optional _next-match)$/
 list-tags-function     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
list-tags-function nil$/
 list2i c-src/emacs/src/lisp.h  /^list2i (EMACS_INT x, EMACS_INT y)$/
@@ -3444,6 +3514,7 @@ local_if_set      c-src/emacs/src/lisp.h  2338
 location       cp-src/clheir.hpp       33
 location       cp-src/clheir.hpp       /^    location() { }$/
 lookup y-src/cccp.y    /^lookup (name, len, hash)$/
+lookup_call    merc-src/accumulator.m  /^:- pred 
lookup_call(accu_goal_store::in, accu_goal/
 lowcase        c-src/etags.c   /^#define lowcase(c)    tolower (CHAR (c))$/
 lucid_event_type_list_p        c-src/emacs/src/keyboard.c      
/^lucid_event_type_list_p (Lisp_Object object)$/
 mabort c-src/emacs/src/gmalloc.c       /^mabort (enum mcheck_status status)$/
@@ -3489,6 +3560,7 @@ mallochook        c-src/emacs/src/gmalloc.c       
/^mallochook (size_t size)$/
 man manpage    make-src/Makefile       /^man manpage: etags.1.man$/
 mao    c-src/h.h       101
 map    c-src/emacs/src/keyboard.c      8748
+map    merc-src/accumulator.m  /^:- import_module map.$/
 map_word       prol-src/natded.prolog  /^map_word([[_]|Ws],Exp):-$/
 mapping        html-src/algrthms.html  /^Mapping the Channel Symbols$/
 mapsyn prol-src/natded.prolog  /^mapsyn(A\/B,AM\/BM):-$/
@@ -3502,15 +3574,18 @@ max_args        c-src/emacs/src/lisp.h  1686
 max_num_directions     cp-src/clheir.hpp       31
 max_num_generic_objects        cp-src/clheir.cpp       9
 maxargs        c-src/emacs/src/lisp.h  2831
+maybe  merc-src/accumulator.m  /^:- import_module maybe.$/
 maybe_gc       c-src/emacs/src/lisp.h  /^maybe_gc (void)$/
 mcCSC  cp-src/c.C      6
 mcheck c-src/emacs/src/gmalloc.c       /^mcheck (void (*func) (enum 
mcheck_status))$/
 mcheck_status  c-src/emacs/src/gmalloc.c       283
 mcheck_used    c-src/emacs/src/gmalloc.c       2012
+mdbcomp        merc-src/accumulator.m  /^:- import_module mdbcomp.$/
 me22b  lua-src/test.lua        /^   local function test.me22b (one)$/
 me_22a lua-src/test.lua        /^   function test.me_22a(one, two)$/
 memalign       c-src/emacs/src/gmalloc.c       /^memalign (size_t alignment, 
size_t size)$/
 member prol-src/natded.prolog  /^member(X,[X|_]).$/
+member_lessthan_goalid merc-src/accumulator.m  /^:- pred 
member_lessthan_goalid(accu_goal_store::in/
 memclear       c-src/emacs/src/lisp.h  /^memclear (void *p, ptrdiff_t nbytes)$/
 menu_bar_item  c-src/emacs/src/keyboard.c      /^menu_bar_item (Lisp_Object 
key, Lisp_Object item, /
 menu_bar_items c-src/emacs/src/keyboard.c      /^menu_bar_items (Lisp_Object 
old)$/
@@ -3781,6 +3856,7 @@ pMu       c-src/emacs/src/lisp.h  151
 pMu    c-src/emacs/src/lisp.h  156
 p_next c-src/etags.c   258
 pagesize       c-src/emacs/src/gmalloc.c       1703
+pair   merc-src/accumulator.m  /^:- import_module pair.$/
 parent c-src/emacs/src/keyboard.c      8745
 parent c-src/emacs/src/lisp.h  1590
 parse  prol-src/natded.prolog  /^parse(Ws,Cat):-$/
@@ -3798,6 +3874,7 @@ parse_return      y-src/parse.y   74
 parse_return_error     y-src/cccp.y    70
 parse_solitary_modifier        c-src/emacs/src/keyboard.c      
/^parse_solitary_modifier (Lisp_Object symbol)$/
 parse_tool_bar_item    c-src/emacs/src/keyboard.c      /^parse_tool_bar_item 
(Lisp_Object key, Lisp_Object /
+parse_tree     merc-src/accumulator.m  /^:- import_module parse_tree.$/
 pat    c-src/etags.c   262
 pattern        c-src/etags.c   260
 pdlcount       c-src/emacs/src/lisp.h  3046
@@ -3990,6 +4067,7 @@ removeexp prol-src/natded.prolog  
/^removeexp(E,E,'NIL'):-!.$/
 reorder_modifiers      c-src/emacs/src/keyboard.c      /^reorder_modifiers 
(Lisp_Object symbol)$/
 request        c.c     /^request request (a, b)$/
 requeued_events_pending_p      c-src/emacs/src/keyboard.c      
/^requeued_events_pending_p (void)$/
+require        merc-src/accumulator.m  /^:- import_module require.$/
 required_argument      c-src/getopt.h  90
 reset-this-command-lengths     c-src/emacs/src/keyboard.c      /^DEFUN 
("reset-this-command-lengths", Freset_this_c/
 restore_getcjmp        c-src/emacs/src/keyboard.c      /^restore_getcjmp 
(sys_jmp_buf temp)$/
@@ -4062,6 +4140,7 @@ separator_names   c-src/emacs/src/keyboard.c      7372
 serializeToVars        php-src/lce_functions.php       /^      function 
serializeToVars($prefix)$/
 serializeToVars        php-src/lce_functions.php       /^      function 
serializeToVars($prefix)$/
 set    cp-src/conway.hpp       /^    void set(void) { alive = 1; }$/
+set    merc-src/accumulator.m  /^:- import_module set.$/
 set-input-interrupt-mode       c-src/emacs/src/keyboard.c      /^DEFUN 
("set-input-interrupt-mode", Fset_input_inte/
 set-input-meta-mode    c-src/emacs/src/keyboard.c      /^DEFUN 
("set-input-meta-mode", Fset_input_meta_mode/
 set-input-mode c-src/emacs/src/keyboard.c      /^DEFUN ("set-input-mode", 
Fset_input_mode, Sset_inp/
@@ -4089,11 +4168,14 @@ set_sub_char_table_contents     c-src/emacs/src/lisp.h  
/^set_sub_char_table_contents
 set_symbol_function    c-src/emacs/src/lisp.h  /^set_symbol_function 
(Lisp_Object sym, Lisp_Object /
 set_symbol_next        c-src/emacs/src/lisp.h  /^set_symbol_next (Lisp_Object 
sym, struct Lisp_Symb/
 set_symbol_plist       c-src/emacs/src/lisp.h  /^set_symbol_plist (Lisp_Object 
sym, Lisp_Object pli/
+set_upto       merc-src/accumulator.m  /^:- func set_upto(accu_case, int) = 
set(accu_goal_i/
 set_waiting_for_input  c-src/emacs/src/keyboard.c      /^set_waiting_for_input 
(struct timespec *time_to_cl/
 setref tex-src/texinfo.tex     
/^\\expandafter\\expandafter\\expandafter\\appendixsetre/
 setup  cp-src/c.C      5
 shift  cp-src/functions.cpp    /^void Date::shift ( void ){\/\/Shift this date 
to pre/
 shouldLoad     objc-src/PackInsp.m     /^-(BOOL)shouldLoad$/
+should_attempt_accu_transform  merc-src/accumulator.m  /^:- pred 
should_attempt_accu_transform(module_info:/
+should_attempt_accu_transform_2        merc-src/accumulator.m  /^:- pred 
should_attempt_accu_transform_2(module_inf/
 should_see_this_array_type     cp-src/c.C      156
 should_see_this_function_pointer       cp-src/c.C      153
 should_see_this_one_enclosed_in_extern_C       cp-src/c.C      149
@@ -4123,6 +4205,7 @@ skip_non_spaces   c-src/etags.c   /^skip_non_spaces (char 
*cp)$/
 skip_spaces    c-src/etags.c   /^skip_spaces (char *cp)$/
 snarf-tag-function     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
snarf-tag-function nil$/
 snone  c-src/etags.c   2443
+solutions      merc-src/accumulator.m  /^:- import_module solutions.$/
 some_mouse_moved       c-src/emacs/src/keyboard.c      /^some_mouse_moved 
(void)$/
 space  tex-src/texinfo.tex     /^    {#2\\labelspace 
#1}\\dotfill\\doshortpageno{#3}}%/
 space  tex-src/texinfo.tex     /^  
\\dosubsubsecentry{#2.#3.#4.#5\\labelspace#1}{#6}}/
@@ -4172,10 +4255,13 @@ step    cp-src/conway.hpp       /^    void step(void) { 
alive = next_alive; }$/
 step   cp-src/clheir.hpp       /^    virtual void step(void) { }$/
 step_everybody cp-src/clheir.cpp       /^void step_everybody(void)$/
 stop_polling   c-src/emacs/src/keyboard.c      /^stop_polling (void)$/
+store_info     merc-src/accumulator.m  /^:- type store_info$/
 store_user_signal_events       c-src/emacs/src/keyboard.c      
/^store_user_signal_events (void)$/
+stored_goal_plain_call merc-src/accumulator.m  /^:- inst 
stored_goal_plain_call for goal_store.stor/
 str    go-src/test1.go 9
 strcaseeq      c-src/etags.c   /^#define strcaseeq(s,t)        (assert 
((s)!=NULL && (t)!=/
 streq  c-src/etags.c   /^#define streq(s,t)    (assert ((s)!=NULL || (t)!=NULL/
+string merc-src/accumulator.m  /^:- import_module string.$/
 string_intervals       c-src/emacs/src/lisp.h  /^string_intervals (Lisp_Object 
s)$/
 stripLine      php-src/lce_functions.php       /^      function 
stripLine($line, $class)$/
 stripname      pas-src/common.pas      /^function stripname; (* ($/
@@ -4315,6 +4401,7 @@ tee       ruby-src/test1.ru       /^    attr_accessor 
:tee$/
 tee=   ruby-src/test1.ru       /^    attr_accessor :tee$/
 temporarily_switch_to_single_kboard    c-src/emacs/src/keyboard.c      
/^temporarily_switch_to_single_kboard (struct frame /
 tend   c-src/etags.c   2432
+term   merc-src/accumulator.m  /^:- import_module term.$/
 terminate      objc-src/Subprocess.m   /^- terminate:sender$/
 terminateInput objc-src/Subprocess.m   /^- terminateInput$/
 test   c-src/emacs/src/lisp.h  1871
@@ -4326,6 +4413,7 @@ test      php-src/ptest.php       /^test $/
 test-begin     scm-src/test.scm        /^(define-syntax test-begin$/
 test.me22b     lua-src/test.lua        /^   local function test.me22b (one)$/
 test.me_22a    lua-src/test.lua        /^   function test.me_22a(one, two)$/
+test1  rs-src/test.rs  /^fn test1() {$/
 test_undefined c-src/emacs/src/keyboard.c      /^test_undefined (Lisp_Object 
binding)$/
 texttreelist   prol-src/natded.prolog  /^texttreelist([]).$/
 there-is-a-=-in-the-middle!    scm-src/test.scm        /^(define 
(there-is-a-=-in-the-middle!) #t)$/
@@ -4365,6 +4453,7 @@ tool_bar_items    c-src/emacs/src/keyboard.c      
/^tool_bar_items (Lisp_Object reuse, i
 tool_bar_items_vector  c-src/emacs/src/keyboard.c      7965
 toolkit_menubar_in_use c-src/emacs/src/keyboard.c      
/^toolkit_menubar_in_use (struct frame *f)$/
 top-level      c-src/emacs/src/keyboard.c      /^DEFUN ("top-level", 
Ftop_level, Stop_level, 0, 0, /
+top_level      merc-src/accumulator.m  /^:- type top_level$/
 top_level_1    c-src/emacs/src/keyboard.c      /^top_level_1 (Lisp_Object 
ignore)$/
 top_level_2    c-src/emacs/src/keyboard.c      /^top_level_2 (void)$/
 total_keys     c-src/emacs/src/keyboard.c      97
@@ -4421,12 +4510,15 @@ unblock_input   c-src/emacs/src/keyboard.c      
/^unblock_input (void)$/
 unblock_input_to       c-src/emacs/src/keyboard.c      /^unblock_input_to (int 
level)$/
 unchar c-src/h.h       99
 unexpand-abbrev        c-src/abbrev.c  /^DEFUN ("unexpand-abbrev", 
Funexpand_abbrev, Sunexp/
+univ   merc-src/accumulator.m  /^:- import_module univ.$/
+unravel_univ   merc-src/accumulator.m  /^:- some [T] pred 
unravel_univ(univ::in, T::out) is/
 unread_switch_frame    c-src/emacs/src/keyboard.c      204
 unsignedp      y-src/cccp.y    112
 unwind c-src/emacs/src/lisp.h  2962
 unwind_int     c-src/emacs/src/lisp.h  2972
 unwind_ptr     c-src/emacs/src/lisp.h  2967
 unwind_void    c-src/emacs/src/lisp.h  2976
+update_accumulator_pred        merc-src/accumulator.m  /^:- pred 
update_accumulator_pred(pred_id::in, proc_/
 uprintmax_t    c-src/emacs/src/lisp.h  149
 uprintmax_t    c-src/emacs/src/lisp.h  154
 usage  perl-src/yagrip.pl      /^sub usage {$/
@@ -4458,6 +4550,7 @@ varargs   tex-src/texinfo.tex     /^\\defvarargs 
{#3}\\endgroup %$/
 varargs        tex-src/texinfo.tex     /^\\defvarargs {#3}\\endgroup %$/
 varargs        tex-src/texinfo.tex     /^\\defvarargs {#2}\\endgroup %$/
 varargs        tex-src/texinfo.tex     /^\\defvarargs {#2}\\endgroup %$/
+varset merc-src/accumulator.m  /^:- import_module varset.$/
 vcopy  c-src/emacs/src/lisp.h  /^vcopy (Lisp_Object v, ptrdiff_t offset, 
Lisp_Objec/
 vectorlike_header      c-src/emacs/src/lisp.h  1343
 verde  cp-src/c.C      40
diff --git a/test/manual/etags/ETAGS.good_1 b/test/manual/etags/ETAGS.good_1
index e6b060f..4eae68b 100644
--- a/test/manual/etags/ETAGS.good_1
+++ b/test/manual/etags/ETAGS.good_1
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,2072
+c-src/abbrev.c,1957
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,33 +186,31 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1039,155 +1037,155 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
 
 c-src/emacs/src/lisp.h,20276
 #define EMACS_LISP_H22,801
@@ -2906,22 +2904,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -3136,6 +3134,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -3350,533 +3353,628 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,3228
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+:- pred generate_warnings334,12550
+:- pred generate_warning342,12895
+:- pred should_attempt_accu_transform365,13886
+:- pred should_attempt_accu_transform_2398,15406
+:- pred accu_standardize440,17390
+:- pred identify_goal_type465,18169
+:- pred is_recursive_case549,21175
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+:- pred accu_store580,22421
+:- pred identify_recursive_calls601,23288
+:- pred identify_out_and_out_prime626,24396
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+:- pred accu_stage1_2727,28347
+:- pred accu_sets_init781,30557
+:- func set_upto796,30984
+:- pred accu_before812,31498
+:- pred accu_assoc835,32477
+:- pred accu_construct862,33712
+:- pred accu_construct_assoc896,35307
+:- pred accu_update938,37069
+:- pred member_lessthan_goalid964,38219
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+:- pred associativity_assertion1014,40263
+:- pred commutativity_assertion1037,41242
+:- pred accu_is_update1057,41952
+:- pred is_associative_construction1078,42802
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+:- pred accu_substs_init1179,46957
+:- pred acc_var_subst_init1194,47573
+:- pred create_new_var1207,48147
+:- pred accu_process_assoc_set1223,48862
+:- pred accu_has_heuristic1297,52081
+:- pred accu_heuristic1304,52336
+:- pred accu_process_update_set1318,52906
+:- pred accu_divide_base_case1380,55844
+:- pred accu_related1412,57146
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+:- pred accu_stage31470,59432
+:- pred acc_proc_info1508,61326
+:- pred acc_pred_info1556,63449
+:- pred accu_create_goal1600,65285
+:- func create_acc_call1621,66400
+:- pred create_orig_goal1634,66987
+:- pred create_acc_goal1662,68157
+:- func create_new_orig_recursive_goals1709,70225
+:- func create_new_recursive_goals1723,70918
+:- func create_new_base_goals1738,71717
+:- pred acc_unification1749,72156
+:- pred accu_top_level1766,72896
+:- pred update_accumulator_pred1856,76290
+:- func accu_rename1876,77253
+:- func base_case_ids1889,77784
+:- func base_case_ids_set1898,78048
+:- func accu_goal_list1905,78269
+:- pred calculate_goal_info1916,78680
+:- func chain_subst1932,79319
+:- pred chain_subst_21938,79482
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
 
 c-src/c.c,76
 T f(1,0
@@ -3984,13 +4082,13 @@ yyerror FUN1(286,5948
 make_list FUN2(293,6028
 #define ERROR 304,6228
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/ETAGS.good_2 b/test/manual/etags/ETAGS.good_2
index ddb8d19..45979d6 100644
--- a/test/manual/etags/ETAGS.good_2
+++ b/test/manual/etags/ETAGS.good_2
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,2072
+c-src/abbrev.c,1957
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,33 +186,31 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1228,160 +1226,160 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static void menu_bar_item 7362,218342
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-static void init_tool_bar_items 7978,236665
-static void process_tool_bar_item 7979,236712
-static bool parse_tool_bar_item 7981,236802
-static void append_tool_bar_item 7982,236862
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
 
 c-src/emacs/src/lisp.h,33840
 #define EMACS_LISP_H22,801
@@ -2712,11 +2710,11 @@ main(37,571
        class D 41,622
                D(43,659
 
-el-src/TAGTEST.EL,179
-(foo::defmumble bletch 1,0
-(defun foo==bar foo==bar2,33
-(defalias 'pending-delete-mode pending-delete-mode6,149
-(defalias (quote explicitly-quoted-pending-delete-mode)9,222
+el-src/TAGTEST.EL,181
+(foo::defmumble bletch 3,33
+(defun foo==bar foo==bar4,66
+(defalias 'pending-delete-mode pending-delete-mode8,182
+(defalias (quote explicitly-quoted-pending-delete-mode)11,255
 
 el-src/emacs/lisp/progmodes/etags.el,5188
 (defvar tags-file-name 34,1035
@@ -3479,22 +3477,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -3709,6 +3707,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -3923,533 +3926,687 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,4915
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+accu_transform_proc247,8578
+:- pred generate_warnings334,12550
+generate_warnings337,12669
+:- pred generate_warning342,12895
+generate_warning345,13001
+:- pred should_attempt_accu_transform365,13886
+should_attempt_accu_transform370,14123
+:- pred should_attempt_accu_transform_2398,15406
+should_attempt_accu_transform_2405,15763
+:- pred accu_standardize440,17390
+accu_standardize442,17455
+:- pred identify_goal_type465,18169
+identify_goal_type469,18359
+:- pred is_recursive_case549,21175
+is_recursive_case551,21253
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+initialize_goal_store573,22166
+:- pred accu_store580,22421
+accu_store584,22576
+:- pred identify_recursive_calls601,23288
+identify_recursive_calls604,23406
+:- pred identify_out_and_out_prime626,24396
+identify_out_and_out_prime631,24631
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+accu_stage1693,27155
+:- pred accu_stage1_2727,28347
+accu_stage1_2731,28515
+:- pred accu_sets_init781,30557
+accu_sets_init783,30605
+:- func set_upto796,30984
+set_upto798,31039
+:- pred accu_before812,31498
+accu_before815,31639
+:- pred accu_assoc835,32477
+accu_assoc838,32617
+:- pred accu_construct862,33712
+accu_construct865,33856
+:- pred accu_construct_assoc896,35307
+accu_construct_assoc899,35457
+:- pred accu_update938,37069
+accu_update941,37210
+:- pred member_lessthan_goalid964,38219
+member_lessthan_goalid967,38342
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+accu_is_associative989,39250
+:- pred associativity_assertion1014,40263
+associativity_assertion1017,40404
+:- pred commutativity_assertion1037,41242
+commutativity_assertion1040,41369
+:- pred accu_is_update1057,41952
+accu_is_update1060,42066
+:- pred is_associative_construction1078,42802
+is_associative_construction1081,42898
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+accu_stage21131,44946
+:- pred accu_substs_init1179,46957
+accu_substs_init1182,47097
+:- pred acc_var_subst_init1194,47573
+acc_var_subst_init1198,47718
+:- pred create_new_var1207,48147
+create_new_var1210,48288
+:- pred accu_process_assoc_set1223,48862
+accu_process_assoc_set1229,49150
+:- pred accu_has_heuristic1297,52081
+accu_has_heuristic1299,52161
+:- pred accu_heuristic1304,52336
+accu_heuristic1307,52457
+:- pred accu_process_update_set1318,52906
+accu_process_update_set1325,53221
+:- pred accu_divide_base_case1380,55844
+accu_divide_base_case1385,56059
+:- pred accu_related1412,57146
+accu_related1415,57270
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+lookup_call1452,58715
+:- pred accu_stage31470,59432
+accu_stage31477,59826
+:- pred acc_proc_info1508,61326
+acc_proc_info1512,61485
+:- pred acc_pred_info1556,63449
+acc_pred_info1559,63597
+:- pred accu_create_goal1600,65285
+accu_create_goal1607,65628
+:- func create_acc_call1621,66400
+create_acc_call1625,66569
+:- pred create_orig_goal1634,66987
+create_orig_goal1638,67176
+:- pred create_acc_goal1662,68157
+create_acc_goal1667,68380
+:- func create_new_orig_recursive_goals1709,70225
+create_new_orig_recursive_goals1712,70368
+:- func create_new_recursive_goals1723,70918
+create_new_recursive_goals1727,71108
+:- func create_new_base_goals1738,71717
+create_new_base_goals1741,71831
+:- pred acc_unification1749,72156
+acc_unification1751,72225
+:- pred accu_top_level1766,72896
+accu_top_level1770,73058
+:- pred update_accumulator_pred1856,76290
+update_accumulator_pred1859,76411
+:- func accu_rename1876,77253
+accu_rename1879,77363
+:- func base_case_ids1889,77784
+base_case_ids1891,77846
+:- func base_case_ids_set1898,78048
+base_case_ids_set1900,78113
+:- func accu_goal_list1905,78269
+accu_goal_list1907,78349
+:- pred calculate_goal_info1916,78680
+calculate_goal_info1918,78753
+:- func chain_subst1932,79319
+chain_subst1934,79378
+:- pred chain_subst_21938,79482
+chain_subst_21941,79576
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
+unravel_univ1961,80340
 
 c-src/c.c,76
 T f(1,0
@@ -4574,13 +4731,13 @@ extern struct node *yylval;yylval306,6246
 unsigned char parse_cell_or_range 309,6291
 unsigned char parse_cell_or_range 311,6355
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/ETAGS.good_3 b/test/manual/etags/ETAGS.good_3
index 40be768..36edc38 100644
--- a/test/manual/etags/ETAGS.good_3
+++ b/test/manual/etags/ETAGS.good_3
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,2072
+c-src/abbrev.c,1957
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,33 +186,31 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1155,165 +1153,165 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-  int sig;7238,215916
-  char *name;name7241,215957
-  int npending;7244,216008
-  struct user_signal_info *next;next7246,216025
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-  Lisp_Object parent;8745,259108
-  Lisp_Object map;8748,259225
-  int start,8753,259447
-  int start, end;8753,259447
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-  short var;11023,332717
-  short kind;11024,332730
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+  int sig;7238,215915
+  char *name;name7241,215956
+  int npending;7244,216007
+  struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+  Lisp_Object parent;8745,259107
+  Lisp_Object map;8748,259224
+  int start,8753,259446
+  int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+  short var;11023,332716
+  short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
 
 c-src/emacs/src/lisp.h,27827
 #define EMACS_LISP_H22,801
@@ -2520,11 +2518,11 @@ main(37,571
                D(43,659
                int x;44,694
 
-el-src/TAGTEST.EL,179
-(foo::defmumble bletch 1,0
-(defun foo==bar foo==bar2,33
-(defalias 'pending-delete-mode pending-delete-mode6,149
-(defalias (quote explicitly-quoted-pending-delete-mode)9,222
+el-src/TAGTEST.EL,181
+(foo::defmumble bletch 3,33
+(defun foo==bar foo==bar4,66
+(defalias 'pending-delete-mode pending-delete-mode8,182
+(defalias (quote explicitly-quoted-pending-delete-mode)11,255
 
 el-src/emacs/lisp/progmodes/etags.el,5069
 (defvar tags-file-name 34,1035
@@ -3313,22 +3311,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -3543,6 +3541,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -3757,533 +3760,628 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,3228
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+:- pred generate_warnings334,12550
+:- pred generate_warning342,12895
+:- pred should_attempt_accu_transform365,13886
+:- pred should_attempt_accu_transform_2398,15406
+:- pred accu_standardize440,17390
+:- pred identify_goal_type465,18169
+:- pred is_recursive_case549,21175
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+:- pred accu_store580,22421
+:- pred identify_recursive_calls601,23288
+:- pred identify_out_and_out_prime626,24396
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+:- pred accu_stage1_2727,28347
+:- pred accu_sets_init781,30557
+:- func set_upto796,30984
+:- pred accu_before812,31498
+:- pred accu_assoc835,32477
+:- pred accu_construct862,33712
+:- pred accu_construct_assoc896,35307
+:- pred accu_update938,37069
+:- pred member_lessthan_goalid964,38219
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+:- pred associativity_assertion1014,40263
+:- pred commutativity_assertion1037,41242
+:- pred accu_is_update1057,41952
+:- pred is_associative_construction1078,42802
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+:- pred accu_substs_init1179,46957
+:- pred acc_var_subst_init1194,47573
+:- pred create_new_var1207,48147
+:- pred accu_process_assoc_set1223,48862
+:- pred accu_has_heuristic1297,52081
+:- pred accu_heuristic1304,52336
+:- pred accu_process_update_set1318,52906
+:- pred accu_divide_base_case1380,55844
+:- pred accu_related1412,57146
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+:- pred accu_stage31470,59432
+:- pred acc_proc_info1508,61326
+:- pred acc_pred_info1556,63449
+:- pred accu_create_goal1600,65285
+:- func create_acc_call1621,66400
+:- pred create_orig_goal1634,66987
+:- pred create_acc_goal1662,68157
+:- func create_new_orig_recursive_goals1709,70225
+:- func create_new_recursive_goals1723,70918
+:- func create_new_base_goals1738,71717
+:- pred acc_unification1749,72156
+:- pred accu_top_level1766,72896
+:- pred update_accumulator_pred1856,76290
+:- func accu_rename1876,77253
+:- func base_case_ids1889,77784
+:- func base_case_ids_set1898,78048
+:- func accu_goal_list1905,78269
+:- pred calculate_goal_info1916,78680
+:- func chain_subst1932,79319
+:- pred chain_subst_21938,79482
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
 
 c-src/c.c,76
 T f(1,0
@@ -4406,13 +4504,13 @@ yyerror FUN1(286,5948
 make_list FUN2(293,6028
 #define ERROR 304,6228
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/ETAGS.good_4 b/test/manual/etags/ETAGS.good_4
index 15f67c5..e726a99 100644
--- a/test/manual/etags/ETAGS.good_4
+++ b/test/manual/etags/ETAGS.good_4
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,3274
+c-src/abbrev.c,3055
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,57 +186,53 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
-  DEFVAR_LISP ("abbrev-table-name-list"542,16092
-  DEFVAR_LISP ("global-abbrev-table"548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table"555,16676
-  DEFVAR_LISP ("last-abbrev"561,17018
-  DEFVAR_LISP ("last-abbrev-text"564,17141
-  DEFVAR_INT ("last-abbrev-location"568,17299
-  DEFVAR_LISP ("abbrev-start-location"575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer"581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table"586,18039
-  DEFVAR_BOOL ("abbrevs-changed"589,18182
-  DEFVAR_BOOL ("abbrev-all-caps"594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook"598,18541
-  DEFVAR_LISP ("abbrev-table-name-list",\1542,16092
-  DEFVAR_LISP ("global-abbrev-table",\1548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1555,16676
-  DEFVAR_LISP ("last-abbrev",\1561,17018
-  DEFVAR_LISP ("last-abbrev-text",\1564,17141
-  DEFVAR_INT ("last-abbrev-location",\1568,17299
-  DEFVAR_LISP ("abbrev-start-location",\1575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer",\1581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table",\1586,18039
-  DEFVAR_BOOL ("abbrevs-changed",\1589,18182
-  DEFVAR_BOOL ("abbrev-all-caps",\1594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook",\1598,18541
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
+  DEFVAR_LISP ("abbrev-table-name-list"536,15905
+  DEFVAR_LISP ("global-abbrev-table"542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table"549,16489
+  DEFVAR_LISP ("last-abbrev"555,16831
+  DEFVAR_LISP ("last-abbrev-text"558,16954
+  DEFVAR_INT ("last-abbrev-location"562,17112
+  DEFVAR_LISP ("abbrev-start-location"569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer"575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table"580,17852
+  DEFVAR_BOOL ("abbrevs-changed"583,17995
+  DEFVAR_BOOL ("abbrev-all-caps"588,18198
+  DEFVAR_LISP ("abbrev-table-name-list",\1536,15905
+  DEFVAR_LISP ("global-abbrev-table",\1542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1549,16489
+  DEFVAR_LISP ("last-abbrev",\1555,16831
+  DEFVAR_LISP ("last-abbrev-text",\1558,16954
+  DEFVAR_INT ("last-abbrev-location",\1562,17112
+  DEFVAR_LISP ("abbrev-start-location",\1569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer",\1575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table",\1580,17852
+  DEFVAR_BOOL ("abbrevs-changed",\1583,17995
+  DEFVAR_BOOL ("abbrev-all-caps",\1588,18198
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1063,295 +1059,295 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-  DEFVAR_LISP ("internal--top-level-message"11058,333973
-  DEFVAR_LISP ("last-command-event"11312,342174
-  DEFVAR_LISP ("last-nonmenu-event"11315,342298
-  DEFVAR_LISP ("last-input-event"11321,342637
-  DEFVAR_LISP ("unread-command-events"11324,342731
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343191
-  DEFVAR_LISP ("unread-input-method-events"11338,343530
-  DEFVAR_LISP ("meta-prefix-char"11346,343899
-  DEFVAR_KBOARD ("last-command"11351,344107
-  DEFVAR_KBOARD ("real-last-command"11368,344788
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344974
-  DEFVAR_LISP ("this-command"11378,345262
-  DEFVAR_LISP ("real-this-command"11384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345681
-  DEFVAR_LISP ("this-original-command"11396,346124
-  DEFVAR_INT ("auto-save-interval"11403,346521
-  DEFVAR_LISP ("auto-save-timeout"11408,346735
-  DEFVAR_LISP ("echo-keystrokes"11415,347080
-  DEFVAR_INT ("polling-period"11421,347351
-  DEFVAR_LISP ("double-click-time"11428,347694
-  DEFVAR_INT ("double-click-fuzz"11435,348030
-  DEFVAR_INT ("num-input-keys"11446,348520
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348795
-  DEFVAR_LISP ("last-event-frame"11457,349033
-  DEFVAR_LISP ("tty-erase-char"11463,349312
-  DEFVAR_LISP ("help-char"11466,349435
-  DEFVAR_LISP ("help-event-list"11472,349718
-  DEFVAR_LISP ("help-form"11477,349929
-  DEFVAR_LISP ("prefix-help-command"11483,350177
-  DEFVAR_LISP ("top-level"11489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350676
-  DEFVAR_BOOL ("cannot-suspend"11511,351489
-  DEFVAR_BOOL ("menu-prompting"11516,351716
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352392
-  DEFVAR_LISP ("deactivate-mark"11545,353118
-  DEFVAR_LISP ("pre-command-hook"11553,353487
-  DEFVAR_LISP ("post-command-hook"11560,353842
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354420
-  DEFVAR_LISP ("menu-bar-final-items"11578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355231
-  DEFVAR_LISP ("overriding-local-map"11598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356104
-  DEFVAR_LISP ("special-event-map"11613,356443
-  DEFVAR_LISP ("track-mouse"11617,356631
-  DEFVAR_KBOARD ("system-key-alist"11620,356758
-  DEFVAR_KBOARD ("local-function-key-map"11629,357139
-  DEFVAR_KBOARD ("input-decode-map"11658,358598
-  DEFVAR_LISP ("function-key-map"11675,359386
-  DEFVAR_LISP ("key-translation-map"11683,359802
-  DEFVAR_LISP ("deferred-action-list"11689,360146
-  DEFVAR_LISP ("deferred-action-function"11694,360394
-  DEFVAR_LISP ("delayed-warnings-list"11700,360693
-  DEFVAR_LISP ("timer-list"11708,361101
-  DEFVAR_LISP ("timer-idle-list"11712,361253
-  DEFVAR_LISP ("input-method-function"11716,361416
-  DEFVAR_LISP ("input-method-previous-message"11737,362385
-  DEFVAR_LISP ("show-help-function"11744,362746
-  DEFVAR_LISP ("disable-point-adjustment"11749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363894
-  DEFVAR_LISP ("throw-on-input"11775,364172
-  DEFVAR_LISP ("command-error-function"11781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364910
-  DEFVAR_LISP ("select-active-regions"11798,365237
-  DEFVAR_LISP ("saved-region-selection"11807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366014
-  DEFVAR_LISP ("debug-on-event"11825,366555
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
-  DEFVAR_LISP ("internal--top-level-message",\111058,333973
-  DEFVAR_LISP ("last-command-event",\111312,342174
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342298
-  DEFVAR_LISP ("last-input-event",\111321,342637
-  DEFVAR_LISP ("unread-command-events",\111324,342731
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343191
-  DEFVAR_LISP ("unread-input-method-events",\111338,343530
-  DEFVAR_LISP ("meta-prefix-char",\111346,343899
-  DEFVAR_KBOARD ("last-command",\111351,344107
-  DEFVAR_KBOARD ("real-last-command",\111368,344788
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344974
-  DEFVAR_LISP ("this-command",\111378,345262
-  DEFVAR_LISP ("real-this-command",\111384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345681
-  DEFVAR_LISP ("this-original-command",\111396,346124
-  DEFVAR_INT ("auto-save-interval",\111403,346521
-  DEFVAR_LISP ("auto-save-timeout",\111408,346735
-  DEFVAR_LISP ("echo-keystrokes",\111415,347080
-  DEFVAR_INT ("polling-period",\111421,347351
-  DEFVAR_LISP ("double-click-time",\111428,347694
-  DEFVAR_INT ("double-click-fuzz",\111435,348030
-  DEFVAR_INT ("num-input-keys",\111446,348520
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348795
-  DEFVAR_LISP ("last-event-frame",\111457,349033
-  DEFVAR_LISP ("tty-erase-char",\111463,349312
-  DEFVAR_LISP ("help-char",\111466,349435
-  DEFVAR_LISP ("help-event-list",\111472,349718
-  DEFVAR_LISP ("help-form",\111477,349929
-  DEFVAR_LISP ("prefix-help-command",\111483,350177
-  DEFVAR_LISP ("top-level",\111489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350676
-  DEFVAR_BOOL ("cannot-suspend",\111511,351489
-  DEFVAR_BOOL ("menu-prompting",\111516,351716
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352392
-  DEFVAR_LISP ("deactivate-mark",\111545,353118
-  DEFVAR_LISP ("pre-command-hook",\111553,353487
-  DEFVAR_LISP ("post-command-hook",\111560,353842
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354420
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355231
-  DEFVAR_LISP ("overriding-local-map",\111598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356104
-  DEFVAR_LISP ("special-event-map",\111613,356443
-  DEFVAR_LISP ("track-mouse",\111617,356631
-  DEFVAR_KBOARD ("system-key-alist",\111620,356758
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357139
-  DEFVAR_KBOARD ("input-decode-map",\111658,358598
-  DEFVAR_LISP ("function-key-map",\111675,359386
-  DEFVAR_LISP ("key-translation-map",\111683,359802
-  DEFVAR_LISP ("deferred-action-list",\111689,360146
-  DEFVAR_LISP ("deferred-action-function",\111694,360394
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360693
-  DEFVAR_LISP ("timer-list",\111708,361101
-  DEFVAR_LISP ("timer-idle-list",\111712,361253
-  DEFVAR_LISP ("input-method-function",\111716,361416
-  DEFVAR_LISP ("input-method-previous-message",\111737,362385
-  DEFVAR_LISP ("show-help-function",\111744,362746
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363894
-  DEFVAR_LISP ("throw-on-input",\111775,364172
-  DEFVAR_LISP ("command-error-function",\111781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364910
-  DEFVAR_LISP ("select-active-regions",\111798,365237
-  DEFVAR_LISP ("saved-region-selection",\111807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366014
-  DEFVAR_LISP ("debug-on-event",\111825,366555
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+  DEFVAR_LISP ("internal--top-level-message"11058,333972
+  DEFVAR_LISP ("last-command-event"11312,342173
+  DEFVAR_LISP ("last-nonmenu-event"11315,342297
+  DEFVAR_LISP ("last-input-event"11321,342636
+  DEFVAR_LISP ("unread-command-events"11324,342730
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+  DEFVAR_LISP ("unread-input-method-events"11338,343529
+  DEFVAR_LISP ("meta-prefix-char"11346,343898
+  DEFVAR_KBOARD ("last-command"11351,344106
+  DEFVAR_KBOARD ("real-last-command"11368,344787
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+  DEFVAR_LISP ("this-command"11378,345261
+  DEFVAR_LISP ("real-this-command"11384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+  DEFVAR_LISP ("this-original-command"11396,346123
+  DEFVAR_INT ("auto-save-interval"11403,346520
+  DEFVAR_LISP ("auto-save-timeout"11408,346734
+  DEFVAR_LISP ("echo-keystrokes"11415,347079
+  DEFVAR_INT ("polling-period"11421,347350
+  DEFVAR_LISP ("double-click-time"11428,347693
+  DEFVAR_INT ("double-click-fuzz"11435,348029
+  DEFVAR_INT ("num-input-keys"11446,348519
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+  DEFVAR_LISP ("last-event-frame"11457,349032
+  DEFVAR_LISP ("tty-erase-char"11463,349311
+  DEFVAR_LISP ("help-char"11466,349434
+  DEFVAR_LISP ("help-event-list"11472,349717
+  DEFVAR_LISP ("help-form"11477,349928
+  DEFVAR_LISP ("prefix-help-command"11483,350176
+  DEFVAR_LISP ("top-level"11489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+  DEFVAR_BOOL ("cannot-suspend"11511,351488
+  DEFVAR_BOOL ("menu-prompting"11516,351715
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+  DEFVAR_LISP ("deactivate-mark"11545,353117
+  DEFVAR_LISP ("pre-command-hook"11553,353486
+  DEFVAR_LISP ("post-command-hook"11560,353841
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+  DEFVAR_LISP ("menu-bar-final-items"11578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+  DEFVAR_LISP ("overriding-local-map"11598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+  DEFVAR_LISP ("special-event-map"11613,356442
+  DEFVAR_LISP ("track-mouse"11617,356630
+  DEFVAR_KBOARD ("system-key-alist"11620,356757
+  DEFVAR_KBOARD ("local-function-key-map"11629,357138
+  DEFVAR_KBOARD ("input-decode-map"11658,358597
+  DEFVAR_LISP ("function-key-map"11675,359385
+  DEFVAR_LISP ("key-translation-map"11683,359801
+  DEFVAR_LISP ("deferred-action-list"11689,360145
+  DEFVAR_LISP ("deferred-action-function"11694,360393
+  DEFVAR_LISP ("delayed-warnings-list"11700,360692
+  DEFVAR_LISP ("timer-list"11708,361100
+  DEFVAR_LISP ("timer-idle-list"11712,361252
+  DEFVAR_LISP ("input-method-function"11716,361415
+  DEFVAR_LISP ("input-method-previous-message"11737,362384
+  DEFVAR_LISP ("show-help-function"11744,362745
+  DEFVAR_LISP ("disable-point-adjustment"11749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+  DEFVAR_LISP ("throw-on-input"11775,364171
+  DEFVAR_LISP ("command-error-function"11781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+  DEFVAR_LISP ("select-active-regions"11798,365236
+  DEFVAR_LISP ("saved-region-selection"11807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+  DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+  DEFVAR_LISP ("internal--top-level-message",\111058,333972
+  DEFVAR_LISP ("last-command-event",\111312,342173
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+  DEFVAR_LISP ("last-input-event",\111321,342636
+  DEFVAR_LISP ("unread-command-events",\111324,342730
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+  DEFVAR_LISP ("unread-input-method-events",\111338,343529
+  DEFVAR_LISP ("meta-prefix-char",\111346,343898
+  DEFVAR_KBOARD ("last-command",\111351,344106
+  DEFVAR_KBOARD ("real-last-command",\111368,344787
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+  DEFVAR_LISP ("this-command",\111378,345261
+  DEFVAR_LISP ("real-this-command",\111384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+  DEFVAR_LISP ("this-original-command",\111396,346123
+  DEFVAR_INT ("auto-save-interval",\111403,346520
+  DEFVAR_LISP ("auto-save-timeout",\111408,346734
+  DEFVAR_LISP ("echo-keystrokes",\111415,347079
+  DEFVAR_INT ("polling-period",\111421,347350
+  DEFVAR_LISP ("double-click-time",\111428,347693
+  DEFVAR_INT ("double-click-fuzz",\111435,348029
+  DEFVAR_INT ("num-input-keys",\111446,348519
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+  DEFVAR_LISP ("last-event-frame",\111457,349032
+  DEFVAR_LISP ("tty-erase-char",\111463,349311
+  DEFVAR_LISP ("help-char",\111466,349434
+  DEFVAR_LISP ("help-event-list",\111472,349717
+  DEFVAR_LISP ("help-form",\111477,349928
+  DEFVAR_LISP ("prefix-help-command",\111483,350176
+  DEFVAR_LISP ("top-level",\111489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+  DEFVAR_BOOL ("cannot-suspend",\111511,351488
+  DEFVAR_BOOL ("menu-prompting",\111516,351715
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+  DEFVAR_LISP ("deactivate-mark",\111545,353117
+  DEFVAR_LISP ("pre-command-hook",\111553,353486
+  DEFVAR_LISP ("post-command-hook",\111560,353841
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+  DEFVAR_LISP ("overriding-local-map",\111598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+  DEFVAR_LISP ("special-event-map",\111613,356442
+  DEFVAR_LISP ("track-mouse",\111617,356630
+  DEFVAR_KBOARD ("system-key-alist",\111620,356757
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+  DEFVAR_KBOARD ("input-decode-map",\111658,358597
+  DEFVAR_LISP ("function-key-map",\111675,359385
+  DEFVAR_LISP ("key-translation-map",\111683,359801
+  DEFVAR_LISP ("deferred-action-list",\111689,360145
+  DEFVAR_LISP ("deferred-action-function",\111694,360393
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+  DEFVAR_LISP ("timer-list",\111708,361100
+  DEFVAR_LISP ("timer-idle-list",\111712,361252
+  DEFVAR_LISP ("input-method-function",\111716,361415
+  DEFVAR_LISP ("input-method-previous-message",\111737,362384
+  DEFVAR_LISP ("show-help-function",\111744,362745
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+  DEFVAR_LISP ("throw-on-input",\111775,364171
+  DEFVAR_LISP ("command-error-function",\111781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+  DEFVAR_LISP ("select-active-regions",\111798,365236
+  DEFVAR_LISP ("saved-region-selection",\111807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+  DEFVAR_LISP ("debug-on-event",\111825,366554
 
 c-src/emacs/src/lisp.h,20276
 #define EMACS_LISP_H22,801
@@ -2307,11 +2303,11 @@ main(37,571
        class D 41,622
                D(43,659
 
-el-src/TAGTEST.EL,179
-(foo::defmumble bletch 1,0
-(defun foo==bar foo==bar2,33
-(defalias 'pending-delete-mode pending-delete-mode6,149
-(defalias (quote explicitly-quoted-pending-delete-mode)9,222
+el-src/TAGTEST.EL,181
+(foo::defmumble bletch 3,33
+(defun foo==bar foo==bar4,66
+(defalias 'pending-delete-mode pending-delete-mode8,182
+(defalias (quote explicitly-quoted-pending-delete-mode)11,255
 
 el-src/emacs/lisp/progmodes/etags.el,5069
 (defvar tags-file-name 34,1035
@@ -3070,22 +3066,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -3300,6 +3296,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -3514,533 +3515,628 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,3228
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+:- pred generate_warnings334,12550
+:- pred generate_warning342,12895
+:- pred should_attempt_accu_transform365,13886
+:- pred should_attempt_accu_transform_2398,15406
+:- pred accu_standardize440,17390
+:- pred identify_goal_type465,18169
+:- pred is_recursive_case549,21175
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+:- pred accu_store580,22421
+:- pred identify_recursive_calls601,23288
+:- pred identify_out_and_out_prime626,24396
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+:- pred accu_stage1_2727,28347
+:- pred accu_sets_init781,30557
+:- func set_upto796,30984
+:- pred accu_before812,31498
+:- pred accu_assoc835,32477
+:- pred accu_construct862,33712
+:- pred accu_construct_assoc896,35307
+:- pred accu_update938,37069
+:- pred member_lessthan_goalid964,38219
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+:- pred associativity_assertion1014,40263
+:- pred commutativity_assertion1037,41242
+:- pred accu_is_update1057,41952
+:- pred is_associative_construction1078,42802
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+:- pred accu_substs_init1179,46957
+:- pred acc_var_subst_init1194,47573
+:- pred create_new_var1207,48147
+:- pred accu_process_assoc_set1223,48862
+:- pred accu_has_heuristic1297,52081
+:- pred accu_heuristic1304,52336
+:- pred accu_process_update_set1318,52906
+:- pred accu_divide_base_case1380,55844
+:- pred accu_related1412,57146
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+:- pred accu_stage31470,59432
+:- pred acc_proc_info1508,61326
+:- pred acc_pred_info1556,63449
+:- pred accu_create_goal1600,65285
+:- func create_acc_call1621,66400
+:- pred create_orig_goal1634,66987
+:- pred create_acc_goal1662,68157
+:- func create_new_orig_recursive_goals1709,70225
+:- func create_new_recursive_goals1723,70918
+:- func create_new_base_goals1738,71717
+:- pred acc_unification1749,72156
+:- pred accu_top_level1766,72896
+:- pred update_accumulator_pred1856,76290
+:- func accu_rename1876,77253
+:- func base_case_ids1889,77784
+:- func base_case_ids_set1898,78048
+:- func accu_goal_list1905,78269
+:- pred calculate_goal_info1916,78680
+:- func chain_subst1932,79319
+:- pred chain_subst_21938,79482
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
 
 c-src/c.c,76
 T f(1,0
@@ -4148,13 +4244,13 @@ yyerror FUN1(286,5948
 make_list FUN2(293,6028
 #define ERROR 304,6228
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/ETAGS.good_5 b/test/manual/etags/ETAGS.good_5
index 583de5c..5133cc9 100644
--- a/test/manual/etags/ETAGS.good_5
+++ b/test/manual/etags/ETAGS.good_5
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,3274
+c-src/abbrev.c,3055
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,57 +186,53 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
-  DEFVAR_LISP ("abbrev-table-name-list"542,16092
-  DEFVAR_LISP ("global-abbrev-table"548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table"555,16676
-  DEFVAR_LISP ("last-abbrev"561,17018
-  DEFVAR_LISP ("last-abbrev-text"564,17141
-  DEFVAR_INT ("last-abbrev-location"568,17299
-  DEFVAR_LISP ("abbrev-start-location"575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer"581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table"586,18039
-  DEFVAR_BOOL ("abbrevs-changed"589,18182
-  DEFVAR_BOOL ("abbrev-all-caps"594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook"598,18541
-  DEFVAR_LISP ("abbrev-table-name-list",\1542,16092
-  DEFVAR_LISP ("global-abbrev-table",\1548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1555,16676
-  DEFVAR_LISP ("last-abbrev",\1561,17018
-  DEFVAR_LISP ("last-abbrev-text",\1564,17141
-  DEFVAR_INT ("last-abbrev-location",\1568,17299
-  DEFVAR_LISP ("abbrev-start-location",\1575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer",\1581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table",\1586,18039
-  DEFVAR_BOOL ("abbrevs-changed",\1589,18182
-  DEFVAR_BOOL ("abbrev-all-caps",\1594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook",\1598,18541
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
+  DEFVAR_LISP ("abbrev-table-name-list"536,15905
+  DEFVAR_LISP ("global-abbrev-table"542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table"549,16489
+  DEFVAR_LISP ("last-abbrev"555,16831
+  DEFVAR_LISP ("last-abbrev-text"558,16954
+  DEFVAR_INT ("last-abbrev-location"562,17112
+  DEFVAR_LISP ("abbrev-start-location"569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer"575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table"580,17852
+  DEFVAR_BOOL ("abbrevs-changed"583,17995
+  DEFVAR_BOOL ("abbrev-all-caps"588,18198
+  DEFVAR_LISP ("abbrev-table-name-list",\1536,15905
+  DEFVAR_LISP ("global-abbrev-table",\1542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1549,16489
+  DEFVAR_LISP ("last-abbrev",\1555,16831
+  DEFVAR_LISP ("last-abbrev-text",\1558,16954
+  DEFVAR_INT ("last-abbrev-location",\1562,17112
+  DEFVAR_LISP ("abbrev-start-location",\1569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer",\1575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table",\1580,17852
+  DEFVAR_BOOL ("abbrevs-changed",\1583,17995
+  DEFVAR_BOOL ("abbrev-all-caps",\1588,18198
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1368,310 +1364,310 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-  int sig;7238,215916
-  char *name;name7241,215957
-  int npending;7244,216008
-  struct user_signal_info *next;next7246,216025
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static void menu_bar_item 7362,218342
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-static void init_tool_bar_items 7978,236665
-static void process_tool_bar_item 7979,236712
-static bool parse_tool_bar_item 7981,236802
-static void append_tool_bar_item 7982,236862
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-  Lisp_Object parent;8745,259108
-  Lisp_Object map;8748,259225
-  int start,8753,259447
-  int start, end;8753,259447
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-  short var;11023,332717
-  short kind;11024,332730
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-  DEFVAR_LISP ("internal--top-level-message"11058,333973
-  DEFVAR_LISP ("last-command-event"11312,342174
-  DEFVAR_LISP ("last-nonmenu-event"11315,342298
-  DEFVAR_LISP ("last-input-event"11321,342637
-  DEFVAR_LISP ("unread-command-events"11324,342731
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343191
-  DEFVAR_LISP ("unread-input-method-events"11338,343530
-  DEFVAR_LISP ("meta-prefix-char"11346,343899
-  DEFVAR_KBOARD ("last-command"11351,344107
-  DEFVAR_KBOARD ("real-last-command"11368,344788
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344974
-  DEFVAR_LISP ("this-command"11378,345262
-  DEFVAR_LISP ("real-this-command"11384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345681
-  DEFVAR_LISP ("this-original-command"11396,346124
-  DEFVAR_INT ("auto-save-interval"11403,346521
-  DEFVAR_LISP ("auto-save-timeout"11408,346735
-  DEFVAR_LISP ("echo-keystrokes"11415,347080
-  DEFVAR_INT ("polling-period"11421,347351
-  DEFVAR_LISP ("double-click-time"11428,347694
-  DEFVAR_INT ("double-click-fuzz"11435,348030
-  DEFVAR_INT ("num-input-keys"11446,348520
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348795
-  DEFVAR_LISP ("last-event-frame"11457,349033
-  DEFVAR_LISP ("tty-erase-char"11463,349312
-  DEFVAR_LISP ("help-char"11466,349435
-  DEFVAR_LISP ("help-event-list"11472,349718
-  DEFVAR_LISP ("help-form"11477,349929
-  DEFVAR_LISP ("prefix-help-command"11483,350177
-  DEFVAR_LISP ("top-level"11489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350676
-  DEFVAR_BOOL ("cannot-suspend"11511,351489
-  DEFVAR_BOOL ("menu-prompting"11516,351716
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352392
-  DEFVAR_LISP ("deactivate-mark"11545,353118
-  DEFVAR_LISP ("pre-command-hook"11553,353487
-  DEFVAR_LISP ("post-command-hook"11560,353842
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354420
-  DEFVAR_LISP ("menu-bar-final-items"11578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355231
-  DEFVAR_LISP ("overriding-local-map"11598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356104
-  DEFVAR_LISP ("special-event-map"11613,356443
-  DEFVAR_LISP ("track-mouse"11617,356631
-  DEFVAR_KBOARD ("system-key-alist"11620,356758
-  DEFVAR_KBOARD ("local-function-key-map"11629,357139
-  DEFVAR_KBOARD ("input-decode-map"11658,358598
-  DEFVAR_LISP ("function-key-map"11675,359386
-  DEFVAR_LISP ("key-translation-map"11683,359802
-  DEFVAR_LISP ("deferred-action-list"11689,360146
-  DEFVAR_LISP ("deferred-action-function"11694,360394
-  DEFVAR_LISP ("delayed-warnings-list"11700,360693
-  DEFVAR_LISP ("timer-list"11708,361101
-  DEFVAR_LISP ("timer-idle-list"11712,361253
-  DEFVAR_LISP ("input-method-function"11716,361416
-  DEFVAR_LISP ("input-method-previous-message"11737,362385
-  DEFVAR_LISP ("show-help-function"11744,362746
-  DEFVAR_LISP ("disable-point-adjustment"11749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363894
-  DEFVAR_LISP ("throw-on-input"11775,364172
-  DEFVAR_LISP ("command-error-function"11781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364910
-  DEFVAR_LISP ("select-active-regions"11798,365237
-  DEFVAR_LISP ("saved-region-selection"11807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366014
-  DEFVAR_LISP ("debug-on-event"11825,366555
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
-  DEFVAR_LISP ("internal--top-level-message",\111058,333973
-  DEFVAR_LISP ("last-command-event",\111312,342174
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342298
-  DEFVAR_LISP ("last-input-event",\111321,342637
-  DEFVAR_LISP ("unread-command-events",\111324,342731
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343191
-  DEFVAR_LISP ("unread-input-method-events",\111338,343530
-  DEFVAR_LISP ("meta-prefix-char",\111346,343899
-  DEFVAR_KBOARD ("last-command",\111351,344107
-  DEFVAR_KBOARD ("real-last-command",\111368,344788
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344974
-  DEFVAR_LISP ("this-command",\111378,345262
-  DEFVAR_LISP ("real-this-command",\111384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345681
-  DEFVAR_LISP ("this-original-command",\111396,346124
-  DEFVAR_INT ("auto-save-interval",\111403,346521
-  DEFVAR_LISP ("auto-save-timeout",\111408,346735
-  DEFVAR_LISP ("echo-keystrokes",\111415,347080
-  DEFVAR_INT ("polling-period",\111421,347351
-  DEFVAR_LISP ("double-click-time",\111428,347694
-  DEFVAR_INT ("double-click-fuzz",\111435,348030
-  DEFVAR_INT ("num-input-keys",\111446,348520
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348795
-  DEFVAR_LISP ("last-event-frame",\111457,349033
-  DEFVAR_LISP ("tty-erase-char",\111463,349312
-  DEFVAR_LISP ("help-char",\111466,349435
-  DEFVAR_LISP ("help-event-list",\111472,349718
-  DEFVAR_LISP ("help-form",\111477,349929
-  DEFVAR_LISP ("prefix-help-command",\111483,350177
-  DEFVAR_LISP ("top-level",\111489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350676
-  DEFVAR_BOOL ("cannot-suspend",\111511,351489
-  DEFVAR_BOOL ("menu-prompting",\111516,351716
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352392
-  DEFVAR_LISP ("deactivate-mark",\111545,353118
-  DEFVAR_LISP ("pre-command-hook",\111553,353487
-  DEFVAR_LISP ("post-command-hook",\111560,353842
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354420
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355231
-  DEFVAR_LISP ("overriding-local-map",\111598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356104
-  DEFVAR_LISP ("special-event-map",\111613,356443
-  DEFVAR_LISP ("track-mouse",\111617,356631
-  DEFVAR_KBOARD ("system-key-alist",\111620,356758
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357139
-  DEFVAR_KBOARD ("input-decode-map",\111658,358598
-  DEFVAR_LISP ("function-key-map",\111675,359386
-  DEFVAR_LISP ("key-translation-map",\111683,359802
-  DEFVAR_LISP ("deferred-action-list",\111689,360146
-  DEFVAR_LISP ("deferred-action-function",\111694,360394
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360693
-  DEFVAR_LISP ("timer-list",\111708,361101
-  DEFVAR_LISP ("timer-idle-list",\111712,361253
-  DEFVAR_LISP ("input-method-function",\111716,361416
-  DEFVAR_LISP ("input-method-previous-message",\111737,362385
-  DEFVAR_LISP ("show-help-function",\111744,362746
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363894
-  DEFVAR_LISP ("throw-on-input",\111775,364172
-  DEFVAR_LISP ("command-error-function",\111781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364910
-  DEFVAR_LISP ("select-active-regions",\111798,365237
-  DEFVAR_LISP ("saved-region-selection",\111807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366014
-  DEFVAR_LISP ("debug-on-event",\111825,366555
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+  int sig;7238,215915
+  char *name;name7241,215956
+  int npending;7244,216007
+  struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+  Lisp_Object parent;8745,259107
+  Lisp_Object map;8748,259224
+  int start,8753,259446
+  int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+  short var;11023,332716
+  short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+  DEFVAR_LISP ("internal--top-level-message"11058,333972
+  DEFVAR_LISP ("last-command-event"11312,342173
+  DEFVAR_LISP ("last-nonmenu-event"11315,342297
+  DEFVAR_LISP ("last-input-event"11321,342636
+  DEFVAR_LISP ("unread-command-events"11324,342730
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+  DEFVAR_LISP ("unread-input-method-events"11338,343529
+  DEFVAR_LISP ("meta-prefix-char"11346,343898
+  DEFVAR_KBOARD ("last-command"11351,344106
+  DEFVAR_KBOARD ("real-last-command"11368,344787
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+  DEFVAR_LISP ("this-command"11378,345261
+  DEFVAR_LISP ("real-this-command"11384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+  DEFVAR_LISP ("this-original-command"11396,346123
+  DEFVAR_INT ("auto-save-interval"11403,346520
+  DEFVAR_LISP ("auto-save-timeout"11408,346734
+  DEFVAR_LISP ("echo-keystrokes"11415,347079
+  DEFVAR_INT ("polling-period"11421,347350
+  DEFVAR_LISP ("double-click-time"11428,347693
+  DEFVAR_INT ("double-click-fuzz"11435,348029
+  DEFVAR_INT ("num-input-keys"11446,348519
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+  DEFVAR_LISP ("last-event-frame"11457,349032
+  DEFVAR_LISP ("tty-erase-char"11463,349311
+  DEFVAR_LISP ("help-char"11466,349434
+  DEFVAR_LISP ("help-event-list"11472,349717
+  DEFVAR_LISP ("help-form"11477,349928
+  DEFVAR_LISP ("prefix-help-command"11483,350176
+  DEFVAR_LISP ("top-level"11489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+  DEFVAR_BOOL ("cannot-suspend"11511,351488
+  DEFVAR_BOOL ("menu-prompting"11516,351715
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+  DEFVAR_LISP ("deactivate-mark"11545,353117
+  DEFVAR_LISP ("pre-command-hook"11553,353486
+  DEFVAR_LISP ("post-command-hook"11560,353841
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+  DEFVAR_LISP ("menu-bar-final-items"11578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+  DEFVAR_LISP ("overriding-local-map"11598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+  DEFVAR_LISP ("special-event-map"11613,356442
+  DEFVAR_LISP ("track-mouse"11617,356630
+  DEFVAR_KBOARD ("system-key-alist"11620,356757
+  DEFVAR_KBOARD ("local-function-key-map"11629,357138
+  DEFVAR_KBOARD ("input-decode-map"11658,358597
+  DEFVAR_LISP ("function-key-map"11675,359385
+  DEFVAR_LISP ("key-translation-map"11683,359801
+  DEFVAR_LISP ("deferred-action-list"11689,360145
+  DEFVAR_LISP ("deferred-action-function"11694,360393
+  DEFVAR_LISP ("delayed-warnings-list"11700,360692
+  DEFVAR_LISP ("timer-list"11708,361100
+  DEFVAR_LISP ("timer-idle-list"11712,361252
+  DEFVAR_LISP ("input-method-function"11716,361415
+  DEFVAR_LISP ("input-method-previous-message"11737,362384
+  DEFVAR_LISP ("show-help-function"11744,362745
+  DEFVAR_LISP ("disable-point-adjustment"11749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+  DEFVAR_LISP ("throw-on-input"11775,364171
+  DEFVAR_LISP ("command-error-function"11781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+  DEFVAR_LISP ("select-active-regions"11798,365236
+  DEFVAR_LISP ("saved-region-selection"11807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+  DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+  DEFVAR_LISP ("internal--top-level-message",\111058,333972
+  DEFVAR_LISP ("last-command-event",\111312,342173
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+  DEFVAR_LISP ("last-input-event",\111321,342636
+  DEFVAR_LISP ("unread-command-events",\111324,342730
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+  DEFVAR_LISP ("unread-input-method-events",\111338,343529
+  DEFVAR_LISP ("meta-prefix-char",\111346,343898
+  DEFVAR_KBOARD ("last-command",\111351,344106
+  DEFVAR_KBOARD ("real-last-command",\111368,344787
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+  DEFVAR_LISP ("this-command",\111378,345261
+  DEFVAR_LISP ("real-this-command",\111384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+  DEFVAR_LISP ("this-original-command",\111396,346123
+  DEFVAR_INT ("auto-save-interval",\111403,346520
+  DEFVAR_LISP ("auto-save-timeout",\111408,346734
+  DEFVAR_LISP ("echo-keystrokes",\111415,347079
+  DEFVAR_INT ("polling-period",\111421,347350
+  DEFVAR_LISP ("double-click-time",\111428,347693
+  DEFVAR_INT ("double-click-fuzz",\111435,348029
+  DEFVAR_INT ("num-input-keys",\111446,348519
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+  DEFVAR_LISP ("last-event-frame",\111457,349032
+  DEFVAR_LISP ("tty-erase-char",\111463,349311
+  DEFVAR_LISP ("help-char",\111466,349434
+  DEFVAR_LISP ("help-event-list",\111472,349717
+  DEFVAR_LISP ("help-form",\111477,349928
+  DEFVAR_LISP ("prefix-help-command",\111483,350176
+  DEFVAR_LISP ("top-level",\111489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+  DEFVAR_BOOL ("cannot-suspend",\111511,351488
+  DEFVAR_BOOL ("menu-prompting",\111516,351715
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+  DEFVAR_LISP ("deactivate-mark",\111545,353117
+  DEFVAR_LISP ("pre-command-hook",\111553,353486
+  DEFVAR_LISP ("post-command-hook",\111560,353841
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+  DEFVAR_LISP ("overriding-local-map",\111598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+  DEFVAR_LISP ("special-event-map",\111613,356442
+  DEFVAR_LISP ("track-mouse",\111617,356630
+  DEFVAR_KBOARD ("system-key-alist",\111620,356757
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+  DEFVAR_KBOARD ("input-decode-map",\111658,358597
+  DEFVAR_LISP ("function-key-map",\111675,359385
+  DEFVAR_LISP ("key-translation-map",\111683,359801
+  DEFVAR_LISP ("deferred-action-list",\111689,360145
+  DEFVAR_LISP ("deferred-action-function",\111694,360393
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+  DEFVAR_LISP ("timer-list",\111708,361100
+  DEFVAR_LISP ("timer-idle-list",\111712,361252
+  DEFVAR_LISP ("input-method-function",\111716,361415
+  DEFVAR_LISP ("input-method-previous-message",\111737,362384
+  DEFVAR_LISP ("show-help-function",\111744,362745
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+  DEFVAR_LISP ("throw-on-input",\111775,364171
+  DEFVAR_LISP ("command-error-function",\111781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+  DEFVAR_LISP ("select-active-regions",\111798,365236
+  DEFVAR_LISP ("saved-region-selection",\111807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+  DEFVAR_LISP ("debug-on-event",\111825,366554
 
 c-src/emacs/src/lisp.h,41391
 #define EMACS_LISP_H22,801
@@ -3253,11 +3249,11 @@ main(37,571
                D(43,659
                int x;44,694
 
-el-src/TAGTEST.EL,179
-(foo::defmumble bletch 1,0
-(defun foo==bar foo==bar2,33
-(defalias 'pending-delete-mode pending-delete-mode6,149
-(defalias (quote explicitly-quoted-pending-delete-mode)9,222
+el-src/TAGTEST.EL,181
+(foo::defmumble bletch 3,33
+(defun foo==bar foo==bar4,66
+(defalias 'pending-delete-mode pending-delete-mode8,182
+(defalias (quote explicitly-quoted-pending-delete-mode)11,255
 
 el-src/emacs/lisp/progmodes/etags.el,5188
 (defvar tags-file-name 34,1035
@@ -4050,22 +4046,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -4280,6 +4276,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -4494,533 +4495,687 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,4915
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+accu_transform_proc247,8578
+:- pred generate_warnings334,12550
+generate_warnings337,12669
+:- pred generate_warning342,12895
+generate_warning345,13001
+:- pred should_attempt_accu_transform365,13886
+should_attempt_accu_transform370,14123
+:- pred should_attempt_accu_transform_2398,15406
+should_attempt_accu_transform_2405,15763
+:- pred accu_standardize440,17390
+accu_standardize442,17455
+:- pred identify_goal_type465,18169
+identify_goal_type469,18359
+:- pred is_recursive_case549,21175
+is_recursive_case551,21253
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+initialize_goal_store573,22166
+:- pred accu_store580,22421
+accu_store584,22576
+:- pred identify_recursive_calls601,23288
+identify_recursive_calls604,23406
+:- pred identify_out_and_out_prime626,24396
+identify_out_and_out_prime631,24631
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+accu_stage1693,27155
+:- pred accu_stage1_2727,28347
+accu_stage1_2731,28515
+:- pred accu_sets_init781,30557
+accu_sets_init783,30605
+:- func set_upto796,30984
+set_upto798,31039
+:- pred accu_before812,31498
+accu_before815,31639
+:- pred accu_assoc835,32477
+accu_assoc838,32617
+:- pred accu_construct862,33712
+accu_construct865,33856
+:- pred accu_construct_assoc896,35307
+accu_construct_assoc899,35457
+:- pred accu_update938,37069
+accu_update941,37210
+:- pred member_lessthan_goalid964,38219
+member_lessthan_goalid967,38342
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+accu_is_associative989,39250
+:- pred associativity_assertion1014,40263
+associativity_assertion1017,40404
+:- pred commutativity_assertion1037,41242
+commutativity_assertion1040,41369
+:- pred accu_is_update1057,41952
+accu_is_update1060,42066
+:- pred is_associative_construction1078,42802
+is_associative_construction1081,42898
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+accu_stage21131,44946
+:- pred accu_substs_init1179,46957
+accu_substs_init1182,47097
+:- pred acc_var_subst_init1194,47573
+acc_var_subst_init1198,47718
+:- pred create_new_var1207,48147
+create_new_var1210,48288
+:- pred accu_process_assoc_set1223,48862
+accu_process_assoc_set1229,49150
+:- pred accu_has_heuristic1297,52081
+accu_has_heuristic1299,52161
+:- pred accu_heuristic1304,52336
+accu_heuristic1307,52457
+:- pred accu_process_update_set1318,52906
+accu_process_update_set1325,53221
+:- pred accu_divide_base_case1380,55844
+accu_divide_base_case1385,56059
+:- pred accu_related1412,57146
+accu_related1415,57270
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+lookup_call1452,58715
+:- pred accu_stage31470,59432
+accu_stage31477,59826
+:- pred acc_proc_info1508,61326
+acc_proc_info1512,61485
+:- pred acc_pred_info1556,63449
+acc_pred_info1559,63597
+:- pred accu_create_goal1600,65285
+accu_create_goal1607,65628
+:- func create_acc_call1621,66400
+create_acc_call1625,66569
+:- pred create_orig_goal1634,66987
+create_orig_goal1638,67176
+:- pred create_acc_goal1662,68157
+create_acc_goal1667,68380
+:- func create_new_orig_recursive_goals1709,70225
+create_new_orig_recursive_goals1712,70368
+:- func create_new_recursive_goals1723,70918
+create_new_recursive_goals1727,71108
+:- func create_new_base_goals1738,71717
+create_new_base_goals1741,71831
+:- pred acc_unification1749,72156
+acc_unification1751,72225
+:- pred accu_top_level1766,72896
+accu_top_level1770,73058
+:- pred update_accumulator_pred1856,76290
+update_accumulator_pred1859,76411
+:- func accu_rename1876,77253
+accu_rename1879,77363
+:- func base_case_ids1889,77784
+base_case_ids1891,77846
+:- func base_case_ids_set1898,78048
+base_case_ids_set1900,78113
+:- func accu_goal_list1905,78269
+accu_goal_list1907,78349
+:- pred calculate_goal_info1916,78680
+calculate_goal_info1918,78753
+:- func chain_subst1932,79319
+chain_subst1934,79378
+:- pred chain_subst_21938,79482
+chain_subst_21941,79576
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
+unravel_univ1961,80340
 
 c-src/c.c,76
 T f(1,0
@@ -5160,13 +5315,13 @@ extern struct node *yylval;yylval306,6246
 unsigned char parse_cell_or_range 309,6291
 unsigned char parse_cell_or_range 311,6355
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/ETAGS.good_6 b/test/manual/etags/ETAGS.good_6
index 86df93a..7504795 100644
--- a/test/manual/etags/ETAGS.good_6
+++ b/test/manual/etags/ETAGS.good_6
@@ -175,7 +175,7 @@ package body Truc.Bidule Truc.Bidule/b138,2153
   protected body Bidule Bidule/b139,2181
   protected body Machin_T Machin_T/b146,2281
 
-c-src/abbrev.c,3274
+c-src/abbrev.c,3055
 Lisp_Object Vabbrev_table_name_list;43,1429
 Lisp_Object Vglobal_abbrev_table;48,1574
 Lisp_Object Vfundamental_mode_abbrev_table;52,1685
@@ -186,57 +186,53 @@ Lisp_Object Vabbrev_start_location_buffer;66,2046
 Lisp_Object Vlast_abbrev;70,2155
 Lisp_Object Vlast_abbrev_text;75,2324
 int last_abbrev_point;79,2414
-Lisp_Object Vpre_abbrev_expand_hook,83,2487
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;83,2487
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,85,2551
-DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table85,2551
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,92,2743
-DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table92,2743
-DEFUN ("define-abbrev", Fdefine_abbrev,107,3124
-DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev107,3124
-DEFUN ("define-global-abbrev", Fdefine_global_abbrev,149,4443
-DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev149,4443
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,160,4814
-DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev160,4814
-DEFUN ("abbrev-symbol", Fabbrev_symbol,174,5282
-DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol174,5282
-DEFUN ("abbrev-expansion", Fabbrev_expansion,202,6246
-DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion202,6246
-DEFUN ("expand-abbrev", Fexpand_abbrev,218,6761
-DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev218,6761
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,389,11682
-DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev389,11682
-write_abbrev 426,12889
-describe_abbrev 445,13324
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,466,13839
-DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description466,13839
-DEFUN ("define-abbrev-table", Fdefine_abbrev_table,506,14995
-DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table506,14995
-syms_of_abbrev 540,16072
-  DEFVAR_LISP ("abbrev-table-name-list"542,16092
-  DEFVAR_LISP ("global-abbrev-table"548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table"555,16676
-  DEFVAR_LISP ("last-abbrev"561,17018
-  DEFVAR_LISP ("last-abbrev-text"564,17141
-  DEFVAR_INT ("last-abbrev-location"568,17299
-  DEFVAR_LISP ("abbrev-start-location"575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer"581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table"586,18039
-  DEFVAR_BOOL ("abbrevs-changed"589,18182
-  DEFVAR_BOOL ("abbrev-all-caps"594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook"598,18541
-  DEFVAR_LISP ("abbrev-table-name-list",\1542,16092
-  DEFVAR_LISP ("global-abbrev-table",\1548,16354
-  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1555,16676
-  DEFVAR_LISP ("last-abbrev",\1561,17018
-  DEFVAR_LISP ("last-abbrev-text",\1564,17141
-  DEFVAR_INT ("last-abbrev-location",\1568,17299
-  DEFVAR_LISP ("abbrev-start-location",\1575,17498
-  DEFVAR_LISP ("abbrev-start-location-buffer",\1581,17775
-  DEFVAR_PER_BUFFER ("local-abbrev-table",\1586,18039
-  DEFVAR_BOOL ("abbrevs-changed",\1589,18182
-  DEFVAR_BOOL ("abbrev-all-caps",\1594,18385
-  DEFVAR_LISP ("pre-abbrev-expand-hook",\1598,18541
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,82,2440
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table82,2440
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,89,2632
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table89,2632
+DEFUN ("define-abbrev", Fdefine_abbrev,104,3013
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev104,3013
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,146,4332
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev146,4332
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,157,4703
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev157,4703
+DEFUN ("abbrev-symbol", Fabbrev_symbol,171,5171
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol171,5171
+DEFUN ("abbrev-expansion", Fabbrev_expansion,199,6135
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion199,6135
+DEFUN ("expand-abbrev", Fexpand_abbrev,215,6650
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev215,6650
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,383,11495
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev383,11495
+write_abbrev 420,12702
+describe_abbrev 439,13137
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,460,13652
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description460,13652
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,500,14808
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table500,14808
+syms_of_abbrev 534,15885
+  DEFVAR_LISP ("abbrev-table-name-list"536,15905
+  DEFVAR_LISP ("global-abbrev-table"542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table"549,16489
+  DEFVAR_LISP ("last-abbrev"555,16831
+  DEFVAR_LISP ("last-abbrev-text"558,16954
+  DEFVAR_INT ("last-abbrev-location"562,17112
+  DEFVAR_LISP ("abbrev-start-location"569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer"575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table"580,17852
+  DEFVAR_BOOL ("abbrevs-changed"583,17995
+  DEFVAR_BOOL ("abbrev-all-caps"588,18198
+  DEFVAR_LISP ("abbrev-table-name-list",\1536,15905
+  DEFVAR_LISP ("global-abbrev-table",\1542,16167
+  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1549,16489
+  DEFVAR_LISP ("last-abbrev",\1555,16831
+  DEFVAR_LISP ("last-abbrev-text",\1558,16954
+  DEFVAR_INT ("last-abbrev-location",\1562,17112
+  DEFVAR_LISP ("abbrev-start-location",\1569,17311
+  DEFVAR_LISP ("abbrev-start-location-buffer",\1575,17588
+  DEFVAR_PER_BUFFER ("local-abbrev-table",\1580,17852
+  DEFVAR_BOOL ("abbrevs-changed",\1583,17995
+  DEFVAR_BOOL ("abbrev-all-caps",\1588,18198
 
 c-src/torture.c,197
 (*tag1 tag118,452
@@ -1368,310 +1364,310 @@ make_lispy_position 5228,157391
 toolkit_menubar_in_use 5456,163954
 make_scroll_bar_position 5469,164322
 make_lispy_event 5485,164968
-make_lispy_movement 6104,183532
-make_lispy_switch_frame 6131,184263
-make_lispy_focus_in 6137,184370
-make_lispy_focus_out 6145,184496
-parse_modifiers_uncached 6163,184946
-#define SINGLE_LETTER_MOD(6185,185466
-#undef SINGLE_LETTER_MOD6212,185907
-#define MULTI_LETTER_MOD(6214,185933
-#undef MULTI_LETTER_MOD6231,186401
-apply_modifiers_uncached 6273,187575
-static const char *const modifier_names[modifier_names6319,189194
-#define NUM_MOD_NAMES 6325,189400
-static Lisp_Object modifier_symbols;6327,189450
-lispy_modifier_list 6331,189587
-#define KEY_TO_CHAR(6353,190253
-parse_modifiers 6356,190329
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191518
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191518
-apply_modifiers 6422,192392
-reorder_modifiers 6491,194721
-modify_event_symbol 6536,196529
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199245
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199245
-parse_solitary_modifier 6695,201136
-#define SINGLE_LETTER_MOD(6701,201259
-#define MULTI_LETTER_MOD(6705,201344
-#undef SINGLE_LETTER_MOD6763,202642
-#undef MULTI_LETTER_MOD6764,202667
-lucid_event_type_list_p 6775,202890
-get_input_pending 6814,203961
-record_asynch_buffer_change 6834,204580
-gobble_input 6872,205703
-tty_read_avail_input 6967,208311
-handle_async_input 7149,214040
-process_pending_signals 7165,214360
-unblock_input_to 7177,214646
-unblock_input 7200,215278
-totally_unblock_input 7209,215446
-handle_input_available_signal 7217,215530
-deliver_input_available_signal 7226,215701
-struct user_signal_info7235,215866
-  int sig;7238,215916
-  char *name;name7241,215957
-  int npending;7244,216008
-  struct user_signal_info *next;next7246,216025
-static struct user_signal_info *user_signals user_signals7250,216091
-add_user_signal 7253,216150
-handle_user_signal 7275,216599
-deliver_user_signal 7316,217559
-find_user_signal_name 7322,217660
-store_user_signal_events 7334,217842
-static void menu_bar_item 7362,218342
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218417
-static Lisp_Object menu_bar_items_vector;7368,218631
-static int menu_bar_items_index;7369,218673
-static const char *separator_names[separator_names7372,218708
-menu_separator_name_p 7393,219149
-menu_bar_items 7426,219853
-Lisp_Object item_properties;7568,224604
-menu_bar_item 7571,224646
-menu_item_eval_property_1 7647,227176
-eval_dyn 7658,227466
-menu_item_eval_property 7666,227676
-parse_menu_item 7686,228342
-static Lisp_Object tool_bar_items_vector;7965,236337
-static Lisp_Object tool_bar_item_properties;7970,236511
-static int ntool_bar_items;7974,236607
-static void init_tool_bar_items 7978,236665
-static void process_tool_bar_item 7979,236712
-static bool parse_tool_bar_item 7981,236802
-static void append_tool_bar_item 7982,236862
-tool_bar_items 7990,237084
-process_tool_bar_item 8075,239893
-#define PROP(8112,240970
-set_prop 8114,241039
-parse_tool_bar_item 8167,242454
-#undef PROP8379,248845
-init_tool_bar_items 8387,248970
-append_tool_bar_item 8401,249262
-read_char_x_menu_prompt 8443,250772
-read_char_minibuf_menu_prompt 8503,252446
-#define PUSH_C_STR(8527,253015
-follow_key 8726,258554
-active_maps 8733,258696
-typedef struct keyremap8742,259022
-  Lisp_Object parent;8745,259108
-  Lisp_Object map;8748,259225
-  int start,8753,259447
-  int start, end;8753,259447
-} keyremap;8754,259465
-access_keymap_keyremap 8764,259809
-keyremap_step 8811,261451
-test_undefined 8867,262935
-read_key_sequence 8916,264862
-read_key_sequence_vs 9826,295822
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297295
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297295
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299983
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299983
-detect_input_pending 9950,300489
-detect_input_pending_ignore_squeezables 9959,300655
-detect_input_pending_run_timers 9967,300871
-clear_input_pending 9985,301363
-requeued_events_pending_p 9997,301733
-DEFUN ("input-pending-p", Finput_pending_p,10002,301814
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301814
-DEFUN ("recent-keys", Frecent_keys,10024,302597
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302597
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303518
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303518
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303959
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303959
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304381
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304381
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304956
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304956
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305496
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305496
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306511
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306511
-DEFUN ("recursion-depth", Frecursion_depth,10158,307070
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307070
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307407
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307407
-DEFUN ("discard-input", Fdiscard_input,10203,308448
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308448
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308950
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308950
-stuff_buffered_input 10285,311046
-set_waiting_for_input 10323,312017
-clear_waiting_for_input 10337,312391
-handle_interrupt_signal 10351,312755
-deliver_interrupt_signal 10378,313643
-static int volatile force_quit_count;10387,313933
-handle_interrupt 10401,314415
-quit_throw_to_read_char 10541,318712
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319289
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319289
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320517
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320517
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321433
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321433
-DEFUN ("set-quit-char", Fset_quit_char,10694,322707
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322707
-DEFUN ("set-input-mode", Fset_input_mode,10729,323571
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323571
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324460
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324460
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325838
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325838
-DEFUN ("posn-at-point", Fposn_at_point,10824,327061
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327061
-init_kboard 10861,328215
-allocate_kboard 10893,329285
-wipe_kboard 10909,329638
-delete_kboard 10917,329752
-init_keyboard 10942,330282
-struct event_head11021,332697
-  short var;11023,332717
-  short kind;11024,332730
-static const struct event_head head_table[head_table11027,332748
-syms_of_keyboard 11045,333578
-  DEFVAR_LISP ("internal--top-level-message"11058,333973
-  DEFVAR_LISP ("last-command-event"11312,342174
-  DEFVAR_LISP ("last-nonmenu-event"11315,342298
-  DEFVAR_LISP ("last-input-event"11321,342637
-  DEFVAR_LISP ("unread-command-events"11324,342731
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343191
-  DEFVAR_LISP ("unread-input-method-events"11338,343530
-  DEFVAR_LISP ("meta-prefix-char"11346,343899
-  DEFVAR_KBOARD ("last-command"11351,344107
-  DEFVAR_KBOARD ("real-last-command"11368,344788
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344974
-  DEFVAR_LISP ("this-command"11378,345262
-  DEFVAR_LISP ("real-this-command"11384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345681
-  DEFVAR_LISP ("this-original-command"11396,346124
-  DEFVAR_INT ("auto-save-interval"11403,346521
-  DEFVAR_LISP ("auto-save-timeout"11408,346735
-  DEFVAR_LISP ("echo-keystrokes"11415,347080
-  DEFVAR_INT ("polling-period"11421,347351
-  DEFVAR_LISP ("double-click-time"11428,347694
-  DEFVAR_INT ("double-click-fuzz"11435,348030
-  DEFVAR_INT ("num-input-keys"11446,348520
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348795
-  DEFVAR_LISP ("last-event-frame"11457,349033
-  DEFVAR_LISP ("tty-erase-char"11463,349312
-  DEFVAR_LISP ("help-char"11466,349435
-  DEFVAR_LISP ("help-event-list"11472,349718
-  DEFVAR_LISP ("help-form"11477,349929
-  DEFVAR_LISP ("prefix-help-command"11483,350177
-  DEFVAR_LISP ("top-level"11489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350676
-  DEFVAR_BOOL ("cannot-suspend"11511,351489
-  DEFVAR_BOOL ("menu-prompting"11516,351716
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352392
-  DEFVAR_LISP ("deactivate-mark"11545,353118
-  DEFVAR_LISP ("pre-command-hook"11553,353487
-  DEFVAR_LISP ("post-command-hook"11560,353842
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354420
-  DEFVAR_LISP ("menu-bar-final-items"11578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355231
-  DEFVAR_LISP ("overriding-local-map"11598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356104
-  DEFVAR_LISP ("special-event-map"11613,356443
-  DEFVAR_LISP ("track-mouse"11617,356631
-  DEFVAR_KBOARD ("system-key-alist"11620,356758
-  DEFVAR_KBOARD ("local-function-key-map"11629,357139
-  DEFVAR_KBOARD ("input-decode-map"11658,358598
-  DEFVAR_LISP ("function-key-map"11675,359386
-  DEFVAR_LISP ("key-translation-map"11683,359802
-  DEFVAR_LISP ("deferred-action-list"11689,360146
-  DEFVAR_LISP ("deferred-action-function"11694,360394
-  DEFVAR_LISP ("delayed-warnings-list"11700,360693
-  DEFVAR_LISP ("timer-list"11708,361101
-  DEFVAR_LISP ("timer-idle-list"11712,361253
-  DEFVAR_LISP ("input-method-function"11716,361416
-  DEFVAR_LISP ("input-method-previous-message"11737,362385
-  DEFVAR_LISP ("show-help-function"11744,362746
-  DEFVAR_LISP ("disable-point-adjustment"11749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363894
-  DEFVAR_LISP ("throw-on-input"11775,364172
-  DEFVAR_LISP ("command-error-function"11781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364910
-  DEFVAR_LISP ("select-active-regions"11798,365237
-  DEFVAR_LISP ("saved-region-selection"11807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366014
-  DEFVAR_LISP ("debug-on-event"11825,366555
-keys_of_keyboard 11841,367116
-mark_kboards 11916,370435
-  DEFVAR_LISP ("internal--top-level-message",\111058,333973
-  DEFVAR_LISP ("last-command-event",\111312,342174
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342298
-  DEFVAR_LISP ("last-input-event",\111321,342637
-  DEFVAR_LISP ("unread-command-events",\111324,342731
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343191
-  DEFVAR_LISP ("unread-input-method-events",\111338,343530
-  DEFVAR_LISP ("meta-prefix-char",\111346,343899
-  DEFVAR_KBOARD ("last-command",\111351,344107
-  DEFVAR_KBOARD ("real-last-command",\111368,344788
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344974
-  DEFVAR_LISP ("this-command",\111378,345262
-  DEFVAR_LISP ("real-this-command",\111384,345499
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345681
-  DEFVAR_LISP ("this-original-command",\111396,346124
-  DEFVAR_INT ("auto-save-interval",\111403,346521
-  DEFVAR_LISP ("auto-save-timeout",\111408,346735
-  DEFVAR_LISP ("echo-keystrokes",\111415,347080
-  DEFVAR_INT ("polling-period",\111421,347351
-  DEFVAR_LISP ("double-click-time",\111428,347694
-  DEFVAR_INT ("double-click-fuzz",\111435,348030
-  DEFVAR_INT ("num-input-keys",\111446,348520
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348795
-  DEFVAR_LISP ("last-event-frame",\111457,349033
-  DEFVAR_LISP ("tty-erase-char",\111463,349312
-  DEFVAR_LISP ("help-char",\111466,349435
-  DEFVAR_LISP ("help-event-list",\111472,349718
-  DEFVAR_LISP ("help-form",\111477,349929
-  DEFVAR_LISP ("prefix-help-command",\111483,350177
-  DEFVAR_LISP ("top-level",\111489,350455
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350676
-  DEFVAR_BOOL ("cannot-suspend",\111511,351489
-  DEFVAR_BOOL ("menu-prompting",\111516,351716
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352146
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352392
-  DEFVAR_LISP ("deactivate-mark",\111545,353118
-  DEFVAR_LISP ("pre-command-hook",\111553,353487
-  DEFVAR_LISP ("post-command-hook",\111560,353842
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354205
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354420
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354623
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354873
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355231
-  DEFVAR_LISP ("overriding-local-map",\111598,355653
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356104
-  DEFVAR_LISP ("special-event-map",\111613,356443
-  DEFVAR_LISP ("track-mouse",\111617,356631
-  DEFVAR_KBOARD ("system-key-alist",\111620,356758
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357139
-  DEFVAR_KBOARD ("input-decode-map",\111658,358598
-  DEFVAR_LISP ("function-key-map",\111675,359386
-  DEFVAR_LISP ("key-translation-map",\111683,359802
-  DEFVAR_LISP ("deferred-action-list",\111689,360146
-  DEFVAR_LISP ("deferred-action-function",\111694,360394
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360693
-  DEFVAR_LISP ("timer-list",\111708,361101
-  DEFVAR_LISP ("timer-idle-list",\111712,361253
-  DEFVAR_LISP ("input-method-function",\111716,361416
-  DEFVAR_LISP ("input-method-previous-message",\111737,362385
-  DEFVAR_LISP ("show-help-function",\111744,362746
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362978
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363528
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363894
-  DEFVAR_LISP ("throw-on-input",\111775,364172
-  DEFVAR_LISP ("command-error-function",\111781,364423
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364910
-  DEFVAR_LISP ("select-active-regions",\111798,365237
-  DEFVAR_LISP ("saved-region-selection",\111807,365629
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366014
-  DEFVAR_LISP ("debug-on-event",\111825,366555
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+  int sig;7238,215915
+  char *name;name7241,215956
+  int npending;7244,216007
+  struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+  Lisp_Object parent;8745,259107
+  Lisp_Object map;8748,259224
+  int start,8753,259446
+  int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,10002,301813
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,10024,302596
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,10158,307069
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,10203,308447
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,10694,322706
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,10729,323570
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,10824,327060
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+  short var;11023,332716
+  short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+  DEFVAR_LISP ("internal--top-level-message"11058,333972
+  DEFVAR_LISP ("last-command-event"11312,342173
+  DEFVAR_LISP ("last-nonmenu-event"11315,342297
+  DEFVAR_LISP ("last-input-event"11321,342636
+  DEFVAR_LISP ("unread-command-events"11324,342730
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+  DEFVAR_LISP ("unread-input-method-events"11338,343529
+  DEFVAR_LISP ("meta-prefix-char"11346,343898
+  DEFVAR_KBOARD ("last-command"11351,344106
+  DEFVAR_KBOARD ("real-last-command"11368,344787
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+  DEFVAR_LISP ("this-command"11378,345261
+  DEFVAR_LISP ("real-this-command"11384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+  DEFVAR_LISP ("this-original-command"11396,346123
+  DEFVAR_INT ("auto-save-interval"11403,346520
+  DEFVAR_LISP ("auto-save-timeout"11408,346734
+  DEFVAR_LISP ("echo-keystrokes"11415,347079
+  DEFVAR_INT ("polling-period"11421,347350
+  DEFVAR_LISP ("double-click-time"11428,347693
+  DEFVAR_INT ("double-click-fuzz"11435,348029
+  DEFVAR_INT ("num-input-keys"11446,348519
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+  DEFVAR_LISP ("last-event-frame"11457,349032
+  DEFVAR_LISP ("tty-erase-char"11463,349311
+  DEFVAR_LISP ("help-char"11466,349434
+  DEFVAR_LISP ("help-event-list"11472,349717
+  DEFVAR_LISP ("help-form"11477,349928
+  DEFVAR_LISP ("prefix-help-command"11483,350176
+  DEFVAR_LISP ("top-level"11489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+  DEFVAR_BOOL ("cannot-suspend"11511,351488
+  DEFVAR_BOOL ("menu-prompting"11516,351715
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+  DEFVAR_LISP ("deactivate-mark"11545,353117
+  DEFVAR_LISP ("pre-command-hook"11553,353486
+  DEFVAR_LISP ("post-command-hook"11560,353841
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+  DEFVAR_LISP ("menu-bar-final-items"11578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+  DEFVAR_LISP ("overriding-local-map"11598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+  DEFVAR_LISP ("special-event-map"11613,356442
+  DEFVAR_LISP ("track-mouse"11617,356630
+  DEFVAR_KBOARD ("system-key-alist"11620,356757
+  DEFVAR_KBOARD ("local-function-key-map"11629,357138
+  DEFVAR_KBOARD ("input-decode-map"11658,358597
+  DEFVAR_LISP ("function-key-map"11675,359385
+  DEFVAR_LISP ("key-translation-map"11683,359801
+  DEFVAR_LISP ("deferred-action-list"11689,360145
+  DEFVAR_LISP ("deferred-action-function"11694,360393
+  DEFVAR_LISP ("delayed-warnings-list"11700,360692
+  DEFVAR_LISP ("timer-list"11708,361100
+  DEFVAR_LISP ("timer-idle-list"11712,361252
+  DEFVAR_LISP ("input-method-function"11716,361415
+  DEFVAR_LISP ("input-method-previous-message"11737,362384
+  DEFVAR_LISP ("show-help-function"11744,362745
+  DEFVAR_LISP ("disable-point-adjustment"11749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+  DEFVAR_LISP ("throw-on-input"11775,364171
+  DEFVAR_LISP ("command-error-function"11781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+  DEFVAR_LISP ("select-active-regions"11798,365236
+  DEFVAR_LISP ("saved-region-selection"11807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+  DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+  DEFVAR_LISP ("internal--top-level-message",\111058,333972
+  DEFVAR_LISP ("last-command-event",\111312,342173
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+  DEFVAR_LISP ("last-input-event",\111321,342636
+  DEFVAR_LISP ("unread-command-events",\111324,342730
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+  DEFVAR_LISP ("unread-input-method-events",\111338,343529
+  DEFVAR_LISP ("meta-prefix-char",\111346,343898
+  DEFVAR_KBOARD ("last-command",\111351,344106
+  DEFVAR_KBOARD ("real-last-command",\111368,344787
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+  DEFVAR_LISP ("this-command",\111378,345261
+  DEFVAR_LISP ("real-this-command",\111384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+  DEFVAR_LISP ("this-original-command",\111396,346123
+  DEFVAR_INT ("auto-save-interval",\111403,346520
+  DEFVAR_LISP ("auto-save-timeout",\111408,346734
+  DEFVAR_LISP ("echo-keystrokes",\111415,347079
+  DEFVAR_INT ("polling-period",\111421,347350
+  DEFVAR_LISP ("double-click-time",\111428,347693
+  DEFVAR_INT ("double-click-fuzz",\111435,348029
+  DEFVAR_INT ("num-input-keys",\111446,348519
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+  DEFVAR_LISP ("last-event-frame",\111457,349032
+  DEFVAR_LISP ("tty-erase-char",\111463,349311
+  DEFVAR_LISP ("help-char",\111466,349434
+  DEFVAR_LISP ("help-event-list",\111472,349717
+  DEFVAR_LISP ("help-form",\111477,349928
+  DEFVAR_LISP ("prefix-help-command",\111483,350176
+  DEFVAR_LISP ("top-level",\111489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+  DEFVAR_BOOL ("cannot-suspend",\111511,351488
+  DEFVAR_BOOL ("menu-prompting",\111516,351715
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+  DEFVAR_LISP ("deactivate-mark",\111545,353117
+  DEFVAR_LISP ("pre-command-hook",\111553,353486
+  DEFVAR_LISP ("post-command-hook",\111560,353841
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+  DEFVAR_LISP ("overriding-local-map",\111598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+  DEFVAR_LISP ("special-event-map",\111613,356442
+  DEFVAR_LISP ("track-mouse",\111617,356630
+  DEFVAR_KBOARD ("system-key-alist",\111620,356757
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+  DEFVAR_KBOARD ("input-decode-map",\111658,358597
+  DEFVAR_LISP ("function-key-map",\111675,359385
+  DEFVAR_LISP ("key-translation-map",\111683,359801
+  DEFVAR_LISP ("deferred-action-list",\111689,360145
+  DEFVAR_LISP ("deferred-action-function",\111694,360393
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+  DEFVAR_LISP ("timer-list",\111708,361100
+  DEFVAR_LISP ("timer-idle-list",\111712,361252
+  DEFVAR_LISP ("input-method-function",\111716,361415
+  DEFVAR_LISP ("input-method-previous-message",\111737,362384
+  DEFVAR_LISP ("show-help-function",\111744,362745
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+  DEFVAR_LISP ("throw-on-input",\111775,364171
+  DEFVAR_LISP ("command-error-function",\111781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+  DEFVAR_LISP ("select-active-regions",\111798,365236
+  DEFVAR_LISP ("saved-region-selection",\111807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+  DEFVAR_LISP ("debug-on-event",\111825,366554
 
 c-src/emacs/src/lisp.h,41391
 #define EMACS_LISP_H22,801
@@ -3253,11 +3249,11 @@ main(37,571
                D(D::D43,659
                int x;D::x44,694
 
-el-src/TAGTEST.EL,179
-(foo::defmumble bletch 1,0
-(defun foo==bar foo==bar2,33
-(defalias 'pending-delete-mode pending-delete-mode6,149
-(defalias (quote explicitly-quoted-pending-delete-mode)9,222
+el-src/TAGTEST.EL,181
+(foo::defmumble bletch 3,33
+(defun foo==bar foo==bar4,66
+(defalias 'pending-delete-mode pending-delete-mode8,182
+(defalias (quote explicitly-quoted-pending-delete-mode)11,255
 
 el-src/emacs/lisp/progmodes/etags.el,5188
 (defvar tags-file-name 34,1035
@@ -4050,22 +4046,22 @@ ord_add_element(71,1867
 ord_del_element(85,2344
 ord_disjoint(100,2783
 ord_intersect(108,2953
-ord_intersection(126,3552
-ord_intersection3(130,3691
-ord_intersection(150,4531
-ord_intersection4(154,4703
-ord_intersection(176,5664
-ord_intersection2(181,5812
-ord_member(200,6318
-ord_seteq(216,6683
-ord_setproduct(225,6971
-ord_subset(240,7377
-ord_subtract(257,7861
-ord_symdiff(265,8054
-ord_union(288,8887
-ord_union4(303,9352
-ord_union(324,10171
-ord_union_all(329,10313
+ord_intersection(126,3553
+ord_intersection3(130,3692
+ord_intersection(150,4533
+ord_intersection4(154,4705
+ord_intersection(176,5666
+ord_intersection2(181,5814
+ord_member(200,6320
+ord_seteq(216,6685
+ord_setproduct(225,6973
+ord_subset(240,7379
+ord_subtract(257,7863
+ord_symdiff(265,8056
+ord_union(288,8889
+ord_union4(303,9354
+ord_union(324,10173
+ord_union_all(329,10315
 
 prol-src/natded.prolog,2319
 expandmng(100,2879
@@ -4280,6 +4276,11 @@ module A9,57
     alias_method ( :foo2,foo237,586
 A::Constant Constant42,655
 
+rs-src/test.rs,52
+enum IpAddrKind 3,11
+fn test1(8,48
+fn main(12,88
+
 scm-src/test.scm,260
 (define hello 1,0
 (set! hello 3,32
@@ -4494,533 +4495,687 @@ tex-src/texinfo.tex,30627
 \def\vritemindex #1{\vritemindex1068,35482
 \def\tablez #1#2#3#4#5#6{\tablez1074,35631
 \def\Edescription{\Edescription1077,35689
-\def\itemfont{\itemfont1082,35891
-\def\Etable{\Etable1090,36117
-\def\itemize{\itemize1103,36441
-\def\itemizezzz #1{\itemizezzz1105,36477
-\def\itemizey #1#2{\itemizey1110,36572
-\def#2{1119,36818
-\def\itemcontents{\itemcontents1120,36859
-\def\bullet{\bullet1123,36907
-\def\minus{\minus1124,36934
-\def\frenchspacing{\frenchspacing1128,37042
-\def\splitoff#1#2\endmark{\splitoff1134,37267
-\def\enumerate{\enumerate1140,37497
-\def\enumeratezzz #1{\enumeratezzz1141,37536
-\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37589
-  \def\thearg{\thearg1146,37736
-  \ifx\thearg\empty \def\thearg{\thearg1147,37755
-\def\numericenumerate{\numericenumerate1184,39089
-\def\lowercaseenumerate{\lowercaseenumerate1190,39219
-\def\uppercaseenumerate{\uppercaseenumerate1203,39566
-\def\startenumeration#1{\startenumeration1219,40056
-\def\alphaenumerate{\alphaenumerate1227,40238
-\def\capsenumerate{\capsenumerate1228,40273
-\def\Ealphaenumerate{\Ealphaenumerate1229,40307
-\def\Ecapsenumerate{\Ecapsenumerate1230,40341
-\def\itemizeitem{\itemizeitem1234,40421
-\def\newindex #1{\newindex1259,41278
-\def\defindex{\defindex1268,41567
-\def\newcodeindex #1{\newcodeindex1272,41675
-\def\defcodeindex{\defcodeindex1279,41935
-\def\synindex #1 #2 {\synindex1283,42115
-\def\syncodeindex #1 #2 {\syncodeindex1292,42455
-\def\doindex#1{\doindex1309,43134
-\def\singleindexer #1{\singleindexer1310,43193
-\def\docodeindex#1{\docodeindex1313,43305
-\def\singlecodeindexer #1{\singlecodeindexer1314,43372
-\def\indexdummies{\indexdummies1316,43430
-\def\_{\_1317,43450
-\def\w{\w1318,43478
-\def\bf{\bf1319,43505
-\def\rm{\rm1320,43534
-\def\sl{\sl1321,43563
-\def\sf{\sf1322,43592
-\def\tt{\tt1323,43620
-\def\gtr{\gtr1324,43648
-\def\less{\less1325,43678
-\def\hat{\hat1326,43710
-\def\char{\char1327,43740
-\def\TeX{\TeX1328,43772
-\def\dots{\dots1329,43802
-\def\copyright{\copyright1330,43835
-\def\tclose##1{\tclose1331,43878
-\def\code##1{\code1332,43923
-\def\samp##1{\samp1333,43964
-\def\t##1{\t1334,44005
-\def\r##1{\r1335,44040
-\def\i##1{\i1336,44075
-\def\b##1{\b1337,44110
-\def\cite##1{\cite1338,44145
-\def\key##1{\key1339,44186
-\def\file##1{\file1340,44225
-\def\var##1{\var1341,44266
-\def\kbd##1{\kbd1342,44305
-\def\indexdummyfont#1{\indexdummyfont1347,44461
-\def\indexdummytex{\indexdummytex1348,44487
-\def\indexdummydots{\indexdummydots1349,44511
-\def\indexnofonts{\indexnofonts1351,44537
-\let\w=\indexdummyfontdummyfont1352,44557
-\let\t=\indexdummyfontdummyfont1353,44580
-\let\r=\indexdummyfontdummyfont1354,44603
-\let\i=\indexdummyfontdummyfont1355,44626
-\let\b=\indexdummyfontdummyfont1356,44649
-\let\emph=\indexdummyfontdummyfont1357,44672
-\let\strong=\indexdummyfontdummyfont1358,44698
-\let\cite=\indexdummyfont=\indexdummyfont1359,44726
-\let\sc=\indexdummyfontdummyfont1360,44752
-\let\tclose=\indexdummyfontdummyfont1364,44924
-\let\code=\indexdummyfontdummyfont1365,44952
-\let\file=\indexdummyfontdummyfont1366,44978
-\let\samp=\indexdummyfontdummyfont1367,45004
-\let\kbd=\indexdummyfontdummyfont1368,45030
-\let\key=\indexdummyfontdummyfont1369,45055
-\let\var=\indexdummyfontdummyfont1370,45080
-\let\TeX=\indexdummytexdummytex1371,45105
-\let\dots=\indexdummydotsdummydots1372,45129
-\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45381
-\def\doind #1#2{\doind1384,45437
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45480
-\def\rawbackslashxx{\rawbackslashxx1389,45620
-{\indexnofontsnofonts1394,45882
-\def\dosubind #1#2#3{\dosubind1405,46193
-{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46241
-\def\rawbackslashxx{\rawbackslashxx1410,46345
-{\indexnofontsnofonts1414,46499
-\def\findex {\findex1443,47430
-\def\kindex {\kindex1444,47453
-\def\cindex {\cindex1445,47476
-\def\vindex {\vindex1446,47499
-\def\tindex {\tindex1447,47522
-\def\pindex {\pindex1448,47545
-\def\cindexsub {\cindexsub1450,47569
-\def\printindex{\printindex1462,47896
-\def\doprintindex#1{\doprintindex1464,47937
-  \def\indexbackslash{\indexbackslash1481,48422
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48461
-\def\initial #1{\initial1517,49533
-\def\entry #1#2{\entry1523,49740
-  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50387
-\def\indexdotfill{\indexdotfill1549,50715
-\def\primary #1{\primary1552,50821
-\def\secondary #1#2{\secondary1556,50903
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50985
-\newbox\partialpageialpage1566,51158
-\def\begindoublecolumns{\begindoublecolumns1572,51316
-  \output={\global\setbox\partialpage=ialpage=1573,51352
-\def\enddoublecolumns{\enddoublecolumns1577,51540
-\def\doublecolumnout{\doublecolumnout1580,51625
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51694
-\def\pagesofar{\pagesofar1584,51872
-\def\balancecolumns{\balancecolumns1588,52109
-  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52280
-     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52541
-\newcount \appendixno  \appendixno = `\@no1627,53446
-\def\appendixletter{\appendixletter1628,53487
-\def\opencontents{\opencontents1632,53590
-\def\thischapter{\thischapter1637,53771
-\def\seccheck#1{\seccheck1638,53809
-\def\chapternofonts{\chapternofonts1643,53913
-\def\result{\result1646,53988
-\def\equiv{\equiv1647,54023
-\def\expansion{\expansion1648,54056
-\def\print{\print1649,54097
-\def\TeX{\TeX1650,54130
-\def\dots{\dots1651,54159
-\def\copyright{\copyright1652,54190
-\def\tt{\tt1653,54231
-\def\bf{\bf1654,54258
-\def\w{\w1655,54286
-\def\less{\less1656,54311
-\def\gtr{\gtr1657,54342
-\def\hat{\hat1658,54371
-\def\char{\char1659,54400
-\def\tclose##1{\tclose1660,54431
-\def\code##1{\code1661,54475
-\def\samp##1{\samp1662,54515
-\def\r##1{\r1663,54555
-\def\b##1{\b1664,54589
-\def\key##1{\key1665,54623
-\def\file##1{\file1666,54661
-\def\kbd##1{\kbd1667,54701
-\def\i##1{\i1669,54809
-\def\cite##1{\cite1670,54843
-\def\var##1{\var1671,54883
-\def\emph##1{\emph1672,54921
-\def\dfn##1{\dfn1673,54961
-\def\thischaptername{\thischaptername1676,55002
-\outer\def\chapter{\chapter1677,55041
-\def\chapterzzz #1{\chapterzzz1678,55082
-{\chapternofonts%nofonts%1687,55478
-\global\let\section = \numberedsec=1692,55631
-\global\let\subsection = \numberedsubsec=1693,55666
-\global\let\subsubsection = \numberedsubsubsec=1694,55707
-\outer\def\appendix{\appendix1697,55758
-\def\appendixzzz #1{\appendixzzz1698,55801
-\global\advance \appendixno by 1 \message{no1700,55878
-\chapmacro {#1}{Appendix \appendixletter}letter1701,55947
-\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56040
-{\chapternofonts%nofonts%1705,56112
-  {#1}{Appendix \appendixletter}letter1707,56168
-\appendixnoderef %noderef1710,56268
-\global\let\section = \appendixsec=1711,56287
-\global\let\subsection = \appendixsubsec=1712,56322
-\global\let\subsubsection = \appendixsubsubsec=1713,56363
-\outer\def\top{\top1716,56414
-\outer\def\unnumbered{\unnumbered1717,56454
-\def\unnumberedzzz #1{\unnumberedzzz1718,56501
-{\chapternofonts%nofonts%1722,56664
-\global\let\section = \unnumberedsec=1727,56814
-\global\let\subsection = \unnumberedsubsec=1728,56851
-\global\let\subsubsection = \unnumberedsubsubsec=1729,56894
-\outer\def\numberedsec{\numberedsec1732,56947
-\def\seczzz #1{\seczzz1733,56988
-{\chapternofonts%nofonts%1736,57144
-\outer\def\appendixsection{\appendixsection1745,57330
-\outer\def\appendixsec{\appendixsec1746,57387
-\def\appendixsectionzzz #1{\appendixsectionzzz1747,57440
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57552
-{\chapternofonts%nofonts%1750,57620
-{#1}{\appendixletter}letter1752,57676
-\appendixnoderef %noderef1755,57776
-\outer\def\unnumberedsec{\unnumberedsec1759,57816
-\def\unnumberedseczzz #1{\unnumberedseczzz1760,57869
-{\chapternofonts%nofonts%1762,57964
-\outer\def\numberedsubsec{\numberedsubsec1770,58132
-\def\numberedsubseczzz #1{\numberedsubseczzz1771,58187
-{\chapternofonts%nofonts%1774,58366
-\outer\def\appendixsubsec{\appendixsubsec1783,58570
-\def\appendixsubseczzz #1{\appendixsubseczzz1784,58625
-\subsecheading {#1}{\appendixletter}letter1786,58747
-{\chapternofonts%nofonts%1787,58812
-{#1}{\appendixletter}letter1789,58871
-\appendixnoderef %noderef1792,58986
-\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59026
-\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59085
-{\chapternofonts%nofonts%1799,59186
-\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59357
-\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59418
-{\chapternofonts%nofonts%1812,59615
-\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59848
-\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59909
-  {\appendixletter}letter1827,60048
-{\chapternofonts%nofonts%1828,60114
-  {\appendixletter}letter1830,60179
-\appendixnoderef %noderef1834,60313
-\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60353
-\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60418
-{\chapternofonts%nofonts%1841,60525
-\def\infotop{\infotop1851,60854
-\def\infounnumbered{\infounnumbered1852,60892
-\def\infounnumberedsec{\infounnumberedsec1853,60937
-\def\infounnumberedsubsec{\infounnumberedsubsec1854,60988
-\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61045
-\def\infoappendix{\infoappendix1857,61109
-\def\infoappendixsec{\infoappendixsec1858,61150
-\def\infoappendixsubsec{\infoappendixsubsec1859,61197
-\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61250
-\def\infochapter{\infochapter1862,61310
-\def\infosection{\infosection1863,61349
-\def\infosubsection{\infosubsection1864,61388
-\def\infosubsubsection{\infosubsubsection1865,61433
-\global\let\section = \numberedsec=1870,61670
-\global\let\subsection = \numberedsubsec=1871,61705
-\global\let\subsubsection = \numberedsubsubsec=1872,61746
-\def\majorheading{\majorheading1886,62253
-\def\majorheadingzzz #1{\majorheadingzzz1887,62298
-\def\chapheading{\chapheading1893,62531
-\def\chapheadingzzz #1{\chapheadingzzz1894,62574
-\def\heading{\heading1899,62769
-\def\subheading{\subheading1901,62806
-\def\subsubheading{\subsubheading1903,62849
-\def\dobreak#1#2{\dobreak1910,63126
-\def\setchapterstyle #1 {\setchapterstyle1912,63204
-\def\chapbreak{\chapbreak1919,63459
-\def\chappager{\chappager1920,63509
-\def\chapoddpage{\chapoddpage1921,63547
-\def\setchapternewpage #1 {\setchapternewpage1923,63626
-\def\CHAPPAGoff{\CHAPPAGoff1925,63683
-\def\CHAPPAGon{\CHAPPAGon1929,63777
-\global\def\HEADINGSon{\HEADINGSon1932,63868
-\def\CHAPPAGodd{\CHAPPAGodd1934,63910
-\global\def\HEADINGSon{\HEADINGSon1937,64006
-\def\CHAPFplain{\CHAPFplain1941,64060
-\def\chfplain #1#2{\chfplain1945,64152
-\def\unnchfplain #1{\unnchfplain1956,64375
-\def\unnchfopen #1{\unnchfopen1964,64604
-\def\chfopen #1#2{\chfopen1970,64812
-\def\CHAPFopen{\CHAPFopen1975,64956
-\def\subsecheadingbreak{\subsecheadingbreak1982,65174
-\def\secheadingbreak{\secheadingbreak1985,65303
-\def\secheading #1#2#3{\secheading1993,65585
-\def\plainsecheading #1{\plainsecheading1994,65641
-\def\secheadingi #1{\secheadingi1995,65684
-\def\subsecheading #1#2#3#4{\subsecheading2006,66052
-\def\subsecheadingi #1{\subsecheadingi2007,66119
-\def\subsubsecfonts{\subsubsecfonts2014,66416
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66539
-\def\subsubsecheadingi #1{\subsubsecheadingi2018,66617
-\def\startcontents#1{\startcontents2032,67089
-   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67362
-\outer\def\contents{\contents2049,67721
-\outer\def\summarycontents{\summarycontents2057,67865
-      \def\secentry ##1##2##3##4{\secentry2067,68236
-      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68271
-      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68306
-      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68347
-      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68385
-      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68432
-\def\chapentry#1#2#3{\chapentry2085,68866
-\def\shortchapentry#1#2#3{\shortchapentry2088,68983
-    {#2\labelspace #1}space2091,69093
-\def\unnumbchapentry#1#2{\unnumbchapentry2094,69147
-\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69194
-\def\secentry#1#2#3#4{\secentry2102,69358
-\def\unnumbsecentry#1#2{\unnumbsecentry2103,69417
-\def\subsecentry#1#2#3#4#5{\subsecentry2106,69478
-\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69548
-\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69622
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69656
-\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69707
-\def\dochapentry#1#2{\dochapentry2123,70081
-\def\dosecentry#1#2{\dosecentry2138,70686
-\def\dosubsecentry#1#2{\dosubsecentry2145,70864
-\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71049
-\def\labelspace{\labelspace2160,71300
-\def\dopageno#1{\dopageno2162,71335
-\def\doshortpageno#1{\doshortpageno2163,71361
-\def\chapentryfonts{\chapentryfonts2165,71393
-\def\secentryfonts{\secentryfonts2166,71428
-\def\point{\point2192,72387
-\def\result{\result2194,72408
-\def\expansion{\expansion2195,72481
-\def\print{\print2196,72552
-\def\equiv{\equiv2198,72619
-\def\error{\error2218,73392
-\def\tex{\tex2224,73621
-\def\@{\@2242,74004
-\gdef\sepspaces{\def {\ }}}\2265,74736
-\def\aboveenvbreak{\aboveenvbreak2268,74818
-\def\afterenvbreak{\afterenvbreak2272,74984
-\def\ctl{\ctl2286,75495
-\def\ctr{\ctr2287,75567
-\def\cbl{\cbl2288,75606
-\def\cbr{\cbr2289,75646
-\def\carttop{\carttop2290,75685
-\def\cartbot{\cartbot2293,75793
-\long\def\cartouche{\cartouche2299,75933
-\def\Ecartouche{\Ecartouche2326,76721
-\def\lisp{\lisp2338,76856
-\def\Elisp{\Elisp2348,77203
-\def\next##1{\next2360,77529
-\def\Eexample{\Eexample2364,77571
-\def\Esmallexample{\Esmallexample2367,77618
-\def\smalllispx{\smalllispx2373,77796
-\def\Esmalllisp{\Esmalllisp2383,78150
-\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78506
-\def\next##1{\next2397,78563
-\def\display{\display2401,78643
-\def\Edisplay{\Edisplay2410,78962
-\def\next##1{\next2422,79273
-\def\format{\format2426,79376
-\def\Eformat{\Eformat2434,79672
-\def\next##1{\next2437,79761
-\def\flushleft{\flushleft2441,79813
-\def\Eflushleft{\Eflushleft2451,80184
-\def\next##1{\next2454,80277
-\def\flushright{\flushright2456,80299
-\def\Eflushright{\Eflushright2466,80671
-\def\next##1{\next2470,80802
-\def\quotation{\quotation2474,80860
-\def\Equotation{\Equotation2480,81052
-\def\setdeffont #1 {\setdeffont2493,81450
-\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81496
-\newskip\defargsindent \defargsindent=50ptargsindent2496,81539
-\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81582
-\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81625
-\def\activeparens{\activeparens2503,81823
-\def\opnr{\opnr2529,83035
-\def\lbrb{\lbrb2530,83100
-\def\defname #1#2{\defname2536,83301
-\advance\dimen2 by -\defbodyindentbodyindent2540,83419
-\advance\dimen3 by -\defbodyindentbodyindent2542,83473
-\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83527
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83669
-\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83744
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84113
-\advance\leftskip by -\defbodyindentbodyindent2557,84247
-\exdentamount=\defbodyindentbodyindent2558,84284
-\def\defparsebody #1#2#3{\defparsebody2568,84643
-\def#1{2572,84827
-\def#2{2573,84863
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84935
-\exdentamount=\defbodyindentbodyindent2576,85009
-\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85113
-\def#1{2585,85274
-\def#2##1 {2586,85310
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85393
-\exdentamount=\defbodyindentbodyindent2589,85467
-\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85552
-\def#1{2596,85713
-\def#2##1 ##2 {2597,85749
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85849
-\exdentamount=\defbodyindentbodyindent2601,85923
-\def\defvarparsebody #1#2#3{\defvarparsebody2608,86194
-\def#1{2612,86381
-\def#2{2613,86417
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86476
-\exdentamount=\defbodyindentbodyindent2616,86550
-\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86641
-\def#1{2625,86800
-\def#2##1 {2626,86836
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86906
-\exdentamount=\defbodyindentbodyindent2629,86980
-\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87052
-\def#1{2636,87216
-\def#2##1 ##2 {2637,87252
-\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87339
-\exdentamount=\defbodyindentbodyindent2641,87413
-\def\defunargs #1{\defunargs2664,88173
-\def\deftypefunargs #1{\deftypefunargs2676,88555
-\def\deffn{\deffn2690,88937
-\def\deffnheader #1#2#3{\deffnheader2692,88994
-\begingroup\defname {name2693,89042
-\def\defun{\defun2699,89187
-\def\defunheader #1#2{\defunheader2701,89240
-\begingroup\defname {name2702,89315
-\defunargs {unargs2703,89351
-\def\deftypefun{\deftypefun2709,89499
-\def\deftypefunheader #1#2{\deftypefunheader2712,89621
-\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89730
-\begingroup\defname {name2716,89822
-\deftypefunargs {typefunargs2717,89868
-\def\deftypefn{\deftypefn2723,90039
-\def\deftypefnheader #1#2#3{\deftypefnheader2726,90188
-\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90324
-\begingroup\defname {name2730,90417
-\deftypefunargs {typefunargs2731,90457
-\def\defmac{\defmac2737,90578
-\def\defmacheader #1#2{\defmacheader2739,90635
-\begingroup\defname {name2740,90711
-\defunargs {unargs2741,90744
-\def\defspec{\defspec2747,90868
-\def\defspecheader #1#2{\defspecheader2749,90929
-\begingroup\defname {name2750,91006
-\defunargs {unargs2751,91046
-\def\deffnx #1 {\deffnx2758,91241
-\def\defunx #1 {\defunx2759,91298
-\def\defmacx #1 {\defmacx2760,91355
-\def\defspecx #1 {\defspecx2761,91414
-\def\deftypefnx #1 {\deftypefnx2762,91475
-\def\deftypeunx #1 {\deftypeunx2763,91540
-\def\defop #1 {\defop2769,91686
-\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91721
-\def\defopheader #1#2#3{\defopheader2772,91775
-\begingroup\defname {name2774,91864
-\defunargs {unargs2775,91910
-\def\defmethod{\defmethod2780,91971
-\def\defmethodheader #1#2#3{\defmethodheader2782,92044
-\begingroup\defname {name2784,92132
-\defunargs {unargs2785,92172
-\def\defcv #1 {\defcv2790,92246
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92281
-\def\defcvarheader #1#2#3{\defcvarheader2793,92340
-\begingroup\defname {name2795,92426
-\defvarargs {varargs2796,92472
-\def\defivar{\defivar2801,92545
-\def\defivarheader #1#2#3{\defivarheader2803,92608
-\begingroup\defname {name2805,92694
-\defvarargs {varargs2806,92745
-\def\defopx #1 {\defopx2812,92894
-\def\defmethodx #1 {\defmethodx2813,92951
-\def\defcvx #1 {\defcvx2814,93016
-\def\defivarx #1 {\defivarx2815,93073
-\def\defvarargs #1{\defvarargs2822,93344
-\def\defvr{\defvr2828,93488
-\def\defvrheader #1#2#3{\defvrheader2830,93543
-\begingroup\defname {name2831,93591
-\def\defvar{\defvar2835,93676
-\def\defvarheader #1#2{\defvarheader2837,93736
-\begingroup\defname {name2838,93807
-\defvarargs {varargs2839,93843
-\def\defopt{\defopt2844,93909
-\def\defoptheader #1#2{\defoptheader2846,93969
-\begingroup\defname {name2847,94040
-\defvarargs {varargs2848,94079
-\def\deftypevar{\deftypevar2853,94136
-\def\deftypevarheader #1#2{\deftypevarheader2856,94252
-\begingroup\defname {name2858,94335
-\def\deftypevr{\deftypevr2865,94509
-\def\deftypevrheader #1#2#3{\deftypevrheader2867,94580
-\begingroup\defname {name2868,94632
-\def\defvrx #1 {\defvrx2876,94869
-\def\defvarx #1 {\defvarx2877,94926
-\def\defoptx #1 {\defoptx2878,94985
-\def\deftypevarx #1 {\deftypevarx2879,95044
-\def\deftypevrx #1 {\deftypevrx2880,95111
-\def\deftpargs #1{\deftpargs2885,95260
-\def\deftp{\deftp2889,95340
-\def\deftpheader #1#2#3{\deftpheader2891,95395
-\begingroup\defname {name2892,95443
-\def\deftpx #1 {\deftpx2897,95602
-\def\setref#1{\setref2908,95923
-\def\unnumbsetref#1{\unnumbsetref2913,96037
-\def\appendixsetref#1{\appendixsetref2918,96144
-\def\pxref#1{\pxref2929,96555
-\def\xref#1{\xref2930,96591
-\def\ref#1{\ref2931,96626
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96656
-\def\printedmanual{\printedmanual2933,96699
-\def\printednodename{\printednodename2934,96737
-\def\printednodename{\printednodename2939,96862
-section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97495
-\refx{x2957,97573
-\def\dosetq #1#2{\dosetq2965,97793
-\def\internalsetq #1#2{\internalsetq2973,98051
-\def\Ypagenumber{\Ypagenumber2977,98152
-\def\Ytitle{\Ytitle2979,98178
-\def\Ynothing{\Ynothing2981,98205
-\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98222
-\def\Yappendixletterandtype{\Yappendixletterandtype2992,98538
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98568
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98623
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98727
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98798
-  \def\linenumber{\linenumber3009,99137
-\def\refx#1#2{\refx3015,99321
-\def\xrdef #1#2{\xrdef3037,99947
-\def\readauxfile{\readauxfile3040,100032
-\def\supereject{\supereject3110,101813
-\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102498
-\def\openindices{\openindices3139,102684
-\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102909
-\parindent = \defaultparindentaultparindent3152,102961
-\def\smallbook{\smallbook3175,103685
-\global\def\Esmallexample{\Esmallexample3192,104112
-\def\afourpaper{\afourpaper3196,104203
-\def\finalout{\finalout3224,105011
-\def\normaldoublequote{\normaldoublequote3235,105272
-\def\normaltilde{\normaltilde3236,105298
-\def\normalcaret{\normalcaret3237,105318
-\def\normalunderscore{\normalunderscore3238,105338
-\def\normalverticalbar{\normalverticalbar3239,105363
-\def\normalless{\normalless3240,105389
-\def\normalgreater{\normalgreater3241,105408
-\def\normalplus{\normalplus3242,105430
-\def\ifusingtt#1#2{\ifusingtt3253,105922
-\def\activedoublequote{\activedoublequote3261,106250
-\def~{~3264,106336
-\def^{^3267,106397
-\def_{_3270,106436
-\def\_{\_3272,106510
-\def\lvvmode{\lvvmode3279,106847
-\def|{|3282,106897
-\def<{<3285,106960
-\def>{>3288,107017
-\def+{+3290,107055
-\def\turnoffactive{\turnoffactive3296,107216
-\global\def={=3307,107502
-\def\normalbackslash{\normalbackslash3321,107884
+\def\itemfont{\itemfont1082,35890
+\def\Etable{\Etable1090,36116
+\def\itemize{\itemize1103,36440
+\def\itemizezzz #1{\itemizezzz1105,36476
+\def\itemizey #1#2{\itemizey1110,36571
+\def#2{1119,36817
+\def\itemcontents{\itemcontents1120,36858
+\def\bullet{\bullet1123,36906
+\def\minus{\minus1124,36933
+\def\frenchspacing{\frenchspacing1128,37041
+\def\splitoff#1#2\endmark{\splitoff1134,37266
+\def\enumerate{\enumerate1140,37496
+\def\enumeratezzz #1{\enumeratezzz1141,37535
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1142,37588
+  \def\thearg{\thearg1146,37735
+  \ifx\thearg\empty \def\thearg{\thearg1147,37754
+\def\numericenumerate{\numericenumerate1184,39088
+\def\lowercaseenumerate{\lowercaseenumerate1190,39218
+\def\uppercaseenumerate{\uppercaseenumerate1203,39565
+\def\startenumeration#1{\startenumeration1219,40055
+\def\alphaenumerate{\alphaenumerate1227,40237
+\def\capsenumerate{\capsenumerate1228,40272
+\def\Ealphaenumerate{\Ealphaenumerate1229,40306
+\def\Ecapsenumerate{\Ecapsenumerate1230,40340
+\def\itemizeitem{\itemizeitem1234,40420
+\def\newindex #1{\newindex1259,41277
+\def\defindex{\defindex1268,41566
+\def\newcodeindex #1{\newcodeindex1272,41674
+\def\defcodeindex{\defcodeindex1279,41934
+\def\synindex #1 #2 {\synindex1283,42114
+\def\syncodeindex #1 #2 {\syncodeindex1292,42454
+\def\doindex#1{\doindex1309,43133
+\def\singleindexer #1{\singleindexer1310,43192
+\def\docodeindex#1{\docodeindex1313,43304
+\def\singlecodeindexer #1{\singlecodeindexer1314,43371
+\def\indexdummies{\indexdummies1316,43429
+\def\_{\_1317,43449
+\def\w{\w1318,43477
+\def\bf{\bf1319,43504
+\def\rm{\rm1320,43533
+\def\sl{\sl1321,43562
+\def\sf{\sf1322,43591
+\def\tt{\tt1323,43619
+\def\gtr{\gtr1324,43647
+\def\less{\less1325,43677
+\def\hat{\hat1326,43709
+\def\char{\char1327,43739
+\def\TeX{\TeX1328,43771
+\def\dots{\dots1329,43801
+\def\copyright{\copyright1330,43834
+\def\tclose##1{\tclose1331,43877
+\def\code##1{\code1332,43922
+\def\samp##1{\samp1333,43963
+\def\t##1{\t1334,44004
+\def\r##1{\r1335,44039
+\def\i##1{\i1336,44074
+\def\b##1{\b1337,44109
+\def\cite##1{\cite1338,44144
+\def\key##1{\key1339,44185
+\def\file##1{\file1340,44224
+\def\var##1{\var1341,44265
+\def\kbd##1{\kbd1342,44304
+\def\indexdummyfont#1{\indexdummyfont1347,44460
+\def\indexdummytex{\indexdummytex1348,44486
+\def\indexdummydots{\indexdummydots1349,44510
+\def\indexnofonts{\indexnofonts1351,44536
+\let\w=\indexdummyfontdummyfont1352,44556
+\let\t=\indexdummyfontdummyfont1353,44579
+\let\r=\indexdummyfontdummyfont1354,44602
+\let\i=\indexdummyfontdummyfont1355,44625
+\let\b=\indexdummyfontdummyfont1356,44648
+\let\emph=\indexdummyfontdummyfont1357,44671
+\let\strong=\indexdummyfontdummyfont1358,44697
+\let\cite=\indexdummyfont=\indexdummyfont1359,44725
+\let\sc=\indexdummyfontdummyfont1360,44751
+\let\tclose=\indexdummyfontdummyfont1364,44923
+\let\code=\indexdummyfontdummyfont1365,44951
+\let\file=\indexdummyfontdummyfont1366,44977
+\let\samp=\indexdummyfontdummyfont1367,45003
+\let\kbd=\indexdummyfontdummyfont1368,45029
+\let\key=\indexdummyfontdummyfont1369,45054
+\let\var=\indexdummyfontdummyfont1370,45079
+\let\TeX=\indexdummytexdummytex1371,45104
+\let\dots=\indexdummydotsdummydots1372,45128
+\let\indexbackslash=0  %overridden during \printindex.backslash=01382,45380
+\def\doind #1#2{\doind1384,45436
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1386,45479
+\def\rawbackslashxx{\rawbackslashxx1389,45619
+{\indexnofontsnofonts1394,45881
+\def\dosubind #1#2#3{\dosubind1405,46192
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1407,46240
+\def\rawbackslashxx{\rawbackslashxx1410,46344
+{\indexnofontsnofonts1414,46498
+\def\findex {\findex1443,47429
+\def\kindex {\kindex1444,47452
+\def\cindex {\cindex1445,47475
+\def\vindex {\vindex1446,47498
+\def\tindex {\tindex1447,47521
+\def\pindex {\pindex1448,47544
+\def\cindexsub {\cindexsub1450,47568
+\def\printindex{\printindex1462,47895
+\def\doprintindex#1{\doprintindex1464,47936
+  \def\indexbackslash{\indexbackslash1481,48421
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1482,48460
+\def\initial #1{\initial1517,49532
+\def\entry #1#2{\entry1523,49739
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1540,50386
+\def\indexdotfill{\indexdotfill1549,50714
+\def\primary #1{\primary1552,50820
+\def\secondary #1#2{\secondary1556,50902
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1559,50984
+\newbox\partialpageialpage1566,51157
+\def\begindoublecolumns{\begindoublecolumns1572,51315
+  \output={\global\setbox\partialpage=ialpage=1573,51351
+\def\enddoublecolumns{\enddoublecolumns1577,51539
+\def\doublecolumnout{\doublecolumnout1580,51624
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1581,51693
+\def\pagesofar{\pagesofar1584,51871
+\def\balancecolumns{\balancecolumns1588,52108
+  \availdimen@=\pageheight \advance\availdimen@ 
by-\ht\partialpageialpage1594,52279
+     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1600,52540
+\newcount \appendixno  \appendixno = `\@no1627,53445
+\def\appendixletter{\appendixletter1628,53486
+\def\opencontents{\opencontents1632,53589
+\def\thischapter{\thischapter1637,53770
+\def\seccheck#1{\seccheck1638,53808
+\def\chapternofonts{\chapternofonts1643,53912
+\def\result{\result1646,53987
+\def\equiv{\equiv1647,54022
+\def\expansion{\expansion1648,54055
+\def\print{\print1649,54096
+\def\TeX{\TeX1650,54129
+\def\dots{\dots1651,54158
+\def\copyright{\copyright1652,54189
+\def\tt{\tt1653,54230
+\def\bf{\bf1654,54257
+\def\w{\w1655,54285
+\def\less{\less1656,54310
+\def\gtr{\gtr1657,54341
+\def\hat{\hat1658,54370
+\def\char{\char1659,54399
+\def\tclose##1{\tclose1660,54430
+\def\code##1{\code1661,54474
+\def\samp##1{\samp1662,54514
+\def\r##1{\r1663,54554
+\def\b##1{\b1664,54588
+\def\key##1{\key1665,54622
+\def\file##1{\file1666,54660
+\def\kbd##1{\kbd1667,54700
+\def\i##1{\i1669,54808
+\def\cite##1{\cite1670,54842
+\def\var##1{\var1671,54882
+\def\emph##1{\emph1672,54920
+\def\dfn##1{\dfn1673,54960
+\def\thischaptername{\thischaptername1676,55001
+\outer\def\chapter{\chapter1677,55040
+\def\chapterzzz #1{\chapterzzz1678,55081
+{\chapternofonts%nofonts%1687,55477
+\global\let\section = \numberedsec=1692,55630
+\global\let\subsection = \numberedsubsec=1693,55665
+\global\let\subsubsection = \numberedsubsubsec=1694,55706
+\outer\def\appendix{\appendix1697,55757
+\def\appendixzzz #1{\appendixzzz1698,55800
+\global\advance \appendixno by 1 \message{no1700,55877
+\chapmacro {#1}{Appendix \appendixletter}letter1701,55946
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1704,56039
+{\chapternofonts%nofonts%1705,56111
+  {#1}{Appendix \appendixletter}letter1707,56167
+\appendixnoderef %noderef1710,56267
+\global\let\section = \appendixsec=1711,56286
+\global\let\subsection = \appendixsubsec=1712,56321
+\global\let\subsubsection = \appendixsubsubsec=1713,56362
+\outer\def\top{\top1716,56413
+\outer\def\unnumbered{\unnumbered1717,56453
+\def\unnumberedzzz #1{\unnumberedzzz1718,56500
+{\chapternofonts%nofonts%1722,56663
+\global\let\section = \unnumberedsec=1727,56813
+\global\let\subsection = \unnumberedsubsec=1728,56850
+\global\let\subsubsection = \unnumberedsubsubsec=1729,56893
+\outer\def\numberedsec{\numberedsec1732,56946
+\def\seczzz #1{\seczzz1733,56987
+{\chapternofonts%nofonts%1736,57143
+\outer\def\appendixsection{\appendixsection1745,57329
+\outer\def\appendixsec{\appendixsec1746,57386
+\def\appendixsectionzzz #1{\appendixsectionzzz1747,57439
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1749,57551
+{\chapternofonts%nofonts%1750,57619
+{#1}{\appendixletter}letter1752,57675
+\appendixnoderef %noderef1755,57775
+\outer\def\unnumberedsec{\unnumberedsec1759,57815
+\def\unnumberedseczzz #1{\unnumberedseczzz1760,57868
+{\chapternofonts%nofonts%1762,57963
+\outer\def\numberedsubsec{\numberedsubsec1770,58131
+\def\numberedsubseczzz #1{\numberedsubseczzz1771,58186
+{\chapternofonts%nofonts%1774,58365
+\outer\def\appendixsubsec{\appendixsubsec1783,58569
+\def\appendixsubseczzz #1{\appendixsubseczzz1784,58624
+\subsecheading {#1}{\appendixletter}letter1786,58746
+{\chapternofonts%nofonts%1787,58811
+{#1}{\appendixletter}letter1789,58870
+\appendixnoderef %noderef1792,58985
+\outer\def\unnumberedsubsec{\unnumberedsubsec1796,59025
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1797,59084
+{\chapternofonts%nofonts%1799,59185
+\outer\def\numberedsubsubsec{\numberedsubsubsec1807,59356
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1808,59417
+{\chapternofonts%nofonts%1812,59614
+\outer\def\appendixsubsubsec{\appendixsubsubsec1823,59847
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1824,59908
+  {\appendixletter}letter1827,60047
+{\chapternofonts%nofonts%1828,60113
+  {\appendixletter}letter1830,60178
+\appendixnoderef %noderef1834,60312
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1838,60352
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1839,60417
+{\chapternofonts%nofonts%1841,60524
+\def\infotop{\infotop1851,60853
+\def\infounnumbered{\infounnumbered1852,60891
+\def\infounnumberedsec{\infounnumberedsec1853,60936
+\def\infounnumberedsubsec{\infounnumberedsubsec1854,60987
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1855,61044
+\def\infoappendix{\infoappendix1857,61108
+\def\infoappendixsec{\infoappendixsec1858,61149
+\def\infoappendixsubsec{\infoappendixsubsec1859,61196
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1860,61249
+\def\infochapter{\infochapter1862,61309
+\def\infosection{\infosection1863,61348
+\def\infosubsection{\infosubsection1864,61387
+\def\infosubsubsection{\infosubsubsection1865,61432
+\global\let\section = \numberedsec=1870,61669
+\global\let\subsection = \numberedsubsec=1871,61704
+\global\let\subsubsection = \numberedsubsubsec=1872,61745
+\def\majorheading{\majorheading1886,62252
+\def\majorheadingzzz #1{\majorheadingzzz1887,62297
+\def\chapheading{\chapheading1893,62530
+\def\chapheadingzzz #1{\chapheadingzzz1894,62573
+\def\heading{\heading1899,62768
+\def\subheading{\subheading1901,62805
+\def\subsubheading{\subsubheading1903,62848
+\def\dobreak#1#2{\dobreak1910,63125
+\def\setchapterstyle #1 {\setchapterstyle1912,63203
+\def\chapbreak{\chapbreak1919,63458
+\def\chappager{\chappager1920,63508
+\def\chapoddpage{\chapoddpage1921,63546
+\def\setchapternewpage #1 {\setchapternewpage1923,63625
+\def\CHAPPAGoff{\CHAPPAGoff1925,63682
+\def\CHAPPAGon{\CHAPPAGon1929,63776
+\global\def\HEADINGSon{\HEADINGSon1932,63867
+\def\CHAPPAGodd{\CHAPPAGodd1934,63909
+\global\def\HEADINGSon{\HEADINGSon1937,64005
+\def\CHAPFplain{\CHAPFplain1941,64059
+\def\chfplain #1#2{\chfplain1945,64151
+\def\unnchfplain #1{\unnchfplain1956,64374
+\def\unnchfopen #1{\unnchfopen1964,64603
+\def\chfopen #1#2{\chfopen1970,64811
+\def\CHAPFopen{\CHAPFopen1975,64955
+\def\subsecheadingbreak{\subsecheadingbreak1982,65173
+\def\secheadingbreak{\secheadingbreak1985,65302
+\def\secheading #1#2#3{\secheading1993,65584
+\def\plainsecheading #1{\plainsecheading1994,65640
+\def\secheadingi #1{\secheadingi1995,65683
+\def\subsecheading #1#2#3#4{\subsecheading2006,66051
+\def\subsecheadingi #1{\subsecheadingi2007,66118
+\def\subsubsecfonts{\subsubsecfonts2014,66415
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2017,66538
+\def\subsubsecheadingi #1{\subsubsecheadingi2018,66616
+\def\startcontents#1{\startcontents2032,67088
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2040,67361
+\outer\def\contents{\contents2049,67720
+\outer\def\summarycontents{\summarycontents2057,67864
+      \def\secentry ##1##2##3##4{\secentry2067,68235
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2068,68270
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2069,68305
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2070,68346
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2071,68384
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2072,68431
+\def\chapentry#1#2#3{\chapentry2085,68865
+\def\shortchapentry#1#2#3{\shortchapentry2088,68982
+    {#2\labelspace #1}space2091,69092
+\def\unnumbchapentry#1#2{\unnumbchapentry2094,69146
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2095,69193
+\def\secentry#1#2#3#4{\secentry2102,69357
+\def\unnumbsecentry#1#2{\unnumbsecentry2103,69416
+\def\subsecentry#1#2#3#4#5{\subsecentry2106,69477
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2107,69547
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2110,69621
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2111,69655
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2112,69706
+\def\dochapentry#1#2{\dochapentry2123,70080
+\def\dosecentry#1#2{\dosecentry2138,70685
+\def\dosubsecentry#1#2{\dosubsecentry2145,70863
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2152,71048
+\def\labelspace{\labelspace2160,71299
+\def\dopageno#1{\dopageno2162,71334
+\def\doshortpageno#1{\doshortpageno2163,71360
+\def\chapentryfonts{\chapentryfonts2165,71392
+\def\secentryfonts{\secentryfonts2166,71427
+\def\point{\point2192,72386
+\def\result{\result2194,72407
+\def\expansion{\expansion2195,72480
+\def\print{\print2196,72551
+\def\equiv{\equiv2198,72618
+\def\error{\error2218,73391
+\def\tex{\tex2224,73620
+\def\@{\@2242,74003
+\gdef\sepspaces{\def {\ }}}\2265,74735
+\def\aboveenvbreak{\aboveenvbreak2268,74817
+\def\afterenvbreak{\afterenvbreak2272,74983
+\def\ctl{\ctl2286,75494
+\def\ctr{\ctr2287,75566
+\def\cbl{\cbl2288,75605
+\def\cbr{\cbr2289,75645
+\def\carttop{\carttop2290,75684
+\def\cartbot{\cartbot2293,75792
+\long\def\cartouche{\cartouche2299,75932
+\def\Ecartouche{\Ecartouche2326,76720
+\def\lisp{\lisp2338,76855
+\def\Elisp{\Elisp2348,77202
+\def\next##1{\next2360,77528
+\def\Eexample{\Eexample2364,77570
+\def\Esmallexample{\Esmallexample2367,77617
+\def\smalllispx{\smalllispx2373,77795
+\def\Esmalllisp{\Esmalllisp2383,78149
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2396,78505
+\def\next##1{\next2397,78562
+\def\display{\display2401,78642
+\def\Edisplay{\Edisplay2410,78961
+\def\next##1{\next2422,79272
+\def\format{\format2426,79375
+\def\Eformat{\Eformat2434,79671
+\def\next##1{\next2437,79760
+\def\flushleft{\flushleft2441,79812
+\def\Eflushleft{\Eflushleft2451,80183
+\def\next##1{\next2454,80276
+\def\flushright{\flushright2456,80298
+\def\Eflushright{\Eflushright2466,80670
+\def\next##1{\next2470,80801
+\def\quotation{\quotation2474,80859
+\def\Equotation{\Equotation2480,81051
+\def\setdeffont #1 {\setdeffont2493,81449
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2495,81495
+\newskip\defargsindent \defargsindent=50ptargsindent2496,81538
+\newskip\deftypemargin \deftypemargin=12pttypemargin2497,81581
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2498,81624
+\def\activeparens{\activeparens2503,81822
+\def\opnr{\opnr2529,83034
+\def\lbrb{\lbrb2530,83099
+\def\defname #1#2{\defname2536,83300
+\advance\dimen2 by -\defbodyindentbodyindent2540,83418
+\advance\dimen3 by -\defbodyindentbodyindent2542,83472
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2544,83526
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2546,83668
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2547,83743
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2554,84112
+\advance\leftskip by -\defbodyindentbodyindent2557,84246
+\exdentamount=\defbodyindentbodyindent2558,84283
+\def\defparsebody #1#2#3{\defparsebody2568,84642
+\def#1{2572,84826
+\def#2{2573,84862
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2575,84934
+\exdentamount=\defbodyindentbodyindent2576,85008
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2581,85112
+\def#1{2585,85273
+\def#2##1 {2586,85309
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2588,85392
+\exdentamount=\defbodyindentbodyindent2589,85466
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2592,85551
+\def#1{2596,85712
+\def#2##1 ##2 {2597,85748
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2600,85848
+\exdentamount=\defbodyindentbodyindent2601,85922
+\def\defvarparsebody #1#2#3{\defvarparsebody2608,86193
+\def#1{2612,86380
+\def#2{2613,86416
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2615,86475
+\exdentamount=\defbodyindentbodyindent2616,86549
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2621,86640
+\def#1{2625,86799
+\def#2##1 {2626,86835
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2628,86905
+\exdentamount=\defbodyindentbodyindent2629,86979
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2632,87051
+\def#1{2636,87215
+\def#2##1 ##2 {2637,87251
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2640,87338
+\exdentamount=\defbodyindentbodyindent2641,87412
+\def\defunargs #1{\defunargs2664,88172
+\def\deftypefunargs #1{\deftypefunargs2676,88554
+\def\deffn{\deffn2690,88936
+\def\deffnheader #1#2#3{\deffnheader2692,88993
+\begingroup\defname {name2693,89041
+\def\defun{\defun2699,89186
+\def\defunheader #1#2{\defunheader2701,89239
+\begingroup\defname {name2702,89314
+\defunargs {unargs2703,89350
+\def\deftypefun{\deftypefun2709,89498
+\def\deftypefunheader #1#2{\deftypefunheader2712,89620
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2714,89729
+\begingroup\defname {name2716,89821
+\deftypefunargs {typefunargs2717,89867
+\def\deftypefn{\deftypefn2723,90038
+\def\deftypefnheader #1#2#3{\deftypefnheader2726,90187
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2728,90323
+\begingroup\defname {name2730,90416
+\deftypefunargs {typefunargs2731,90456
+\def\defmac{\defmac2737,90577
+\def\defmacheader #1#2{\defmacheader2739,90634
+\begingroup\defname {name2740,90710
+\defunargs {unargs2741,90743
+\def\defspec{\defspec2747,90867
+\def\defspecheader #1#2{\defspecheader2749,90928
+\begingroup\defname {name2750,91005
+\defunargs {unargs2751,91045
+\def\deffnx #1 {\deffnx2758,91240
+\def\defunx #1 {\defunx2759,91297
+\def\defmacx #1 {\defmacx2760,91354
+\def\defspecx #1 {\defspecx2761,91413
+\def\deftypefnx #1 {\deftypefnx2762,91474
+\def\deftypeunx #1 {\deftypeunx2763,91539
+\def\defop #1 {\defop2769,91685
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2770,91720
+\def\defopheader #1#2#3{\defopheader2772,91774
+\begingroup\defname {name2774,91863
+\defunargs {unargs2775,91909
+\def\defmethod{\defmethod2780,91970
+\def\defmethodheader #1#2#3{\defmethodheader2782,92043
+\begingroup\defname {name2784,92131
+\defunargs {unargs2785,92171
+\def\defcv #1 {\defcv2790,92245
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2791,92280
+\def\defcvarheader #1#2#3{\defcvarheader2793,92339
+\begingroup\defname {name2795,92425
+\defvarargs {varargs2796,92471
+\def\defivar{\defivar2801,92544
+\def\defivarheader #1#2#3{\defivarheader2803,92607
+\begingroup\defname {name2805,92693
+\defvarargs {varargs2806,92744
+\def\defopx #1 {\defopx2812,92893
+\def\defmethodx #1 {\defmethodx2813,92950
+\def\defcvx #1 {\defcvx2814,93015
+\def\defivarx #1 {\defivarx2815,93072
+\def\defvarargs #1{\defvarargs2822,93343
+\def\defvr{\defvr2828,93487
+\def\defvrheader #1#2#3{\defvrheader2830,93542
+\begingroup\defname {name2831,93590
+\def\defvar{\defvar2835,93675
+\def\defvarheader #1#2{\defvarheader2837,93735
+\begingroup\defname {name2838,93806
+\defvarargs {varargs2839,93842
+\def\defopt{\defopt2844,93908
+\def\defoptheader #1#2{\defoptheader2846,93968
+\begingroup\defname {name2847,94039
+\defvarargs {varargs2848,94078
+\def\deftypevar{\deftypevar2853,94135
+\def\deftypevarheader #1#2{\deftypevarheader2856,94251
+\begingroup\defname {name2858,94334
+\def\deftypevr{\deftypevr2865,94508
+\def\deftypevrheader #1#2#3{\deftypevrheader2867,94579
+\begingroup\defname {name2868,94631
+\def\defvrx #1 {\defvrx2876,94868
+\def\defvarx #1 {\defvarx2877,94925
+\def\defoptx #1 {\defoptx2878,94984
+\def\deftypevarx #1 {\deftypevarx2879,95043
+\def\deftypevrx #1 {\deftypevrx2880,95110
+\def\deftpargs #1{\deftpargs2885,95259
+\def\deftp{\deftp2889,95339
+\def\deftpheader #1#2#3{\deftpheader2891,95394
+\begingroup\defname {name2892,95442
+\def\deftpx #1 {\deftpx2897,95601
+\def\setref#1{\setref2908,95922
+\def\unnumbsetref#1{\unnumbsetref2913,96036
+\def\appendixsetref#1{\appendixsetref2918,96143
+\def\pxref#1{\pxref2929,96554
+\def\xref#1{\xref2930,96590
+\def\ref#1{\ref2931,96625
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2932,96655
+\def\printedmanual{\printedmanual2933,96698
+\def\printednodename{\printednodename2934,96736
+\def\printednodename{\printednodename2939,96861
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2954,97493
+\refx{x2957,97571
+\def\dosetq #1#2{\dosetq2965,97791
+\def\internalsetq #1#2{\internalsetq2973,98049
+\def\Ypagenumber{\Ypagenumber2977,98150
+\def\Ytitle{\Ytitle2979,98176
+\def\Ynothing{\Ynothing2981,98203
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2983,98220
+\def\Yappendixletterandtype{\Yappendixletterandtype2992,98536
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2993,98566
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2994,98621
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2996,98725
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2998,98796
+  \def\linenumber{\linenumber3009,99135
+\def\refx#1#2{\refx3015,99319
+\def\xrdef #1#2{\xrdef3037,99945
+\def\readauxfile{\readauxfile3040,100030
+\def\supereject{\supereject3110,101811
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3131,102496
+\def\openindices{\openindices3139,102682
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3151,102907
+\parindent = \defaultparindentaultparindent3152,102959
+\def\smallbook{\smallbook3175,103683
+\global\def\Esmallexample{\Esmallexample3192,104110
+\def\afourpaper{\afourpaper3196,104201
+\def\finalout{\finalout3224,105009
+\def\normaldoublequote{\normaldoublequote3235,105270
+\def\normaltilde{\normaltilde3236,105296
+\def\normalcaret{\normalcaret3237,105316
+\def\normalunderscore{\normalunderscore3238,105336
+\def\normalverticalbar{\normalverticalbar3239,105361
+\def\normalless{\normalless3240,105387
+\def\normalgreater{\normalgreater3241,105406
+\def\normalplus{\normalplus3242,105428
+\def\ifusingtt#1#2{\ifusingtt3253,105920
+\def\activedoublequote{\activedoublequote3261,106248
+\def~{~3264,106334
+\def^{^3267,106395
+\def_{_3270,106434
+\def\_{\_3272,106508
+\def\lvvmode{\lvvmode3279,106845
+\def|{|3282,106895
+\def<{<3285,106958
+\def>{>3288,107015
+\def+{+3290,107053
+\def\turnoffactive{\turnoffactive3296,107214
+\global\def={=3307,107500
+\def\normalbackslash{\normalbackslash3321,107882
+
+merc-src/accumulator.m,4915
+:- interface146,5371
+:- import_module hlds148,5386
+:- import_module univ152,5478
+:- pred accu_transform_proc159,5793
+:- implementation166,6115
+:- import_module libs180,6552
+:- import_module mdbcomp184,6681
+:- import_module parse_tree186,6742
+:- import_module assoc_list194,7013
+:- import_module bool195,7042
+:- import_module int196,7065
+:- import_module io197,7087
+:- import_module list198,7108
+:- import_module map199,7131
+:- import_module maybe200,7153
+:- import_module pair201,7177
+:- import_module require202,7200
+:- import_module set203,7226
+:- import_module solutions204,7248
+:- import_module string205,7276
+:- import_module term206,7301
+:- import_module varset207,7324
+:- type top_level213,7499
+:- type accu_goal_id225,7900
+:- type accu_case228,7964
+:- type accu_goal_store234,8091
+:- type accu_subst238,8216
+:- type accu_warning240,8264
+accu_transform_proc247,8578
+:- pred generate_warnings334,12550
+generate_warnings337,12669
+:- pred generate_warning342,12895
+generate_warning345,13001
+:- pred should_attempt_accu_transform365,13886
+should_attempt_accu_transform370,14123
+:- pred should_attempt_accu_transform_2398,15406
+should_attempt_accu_transform_2405,15763
+:- pred accu_standardize440,17390
+accu_standardize442,17455
+:- pred identify_goal_type465,18169
+identify_goal_type469,18359
+:- pred is_recursive_case549,21175
+is_recursive_case551,21253
+:- type store_info560,21713
+:- func initialize_goal_store570,22060
+initialize_goal_store573,22166
+:- pred accu_store580,22421
+accu_store584,22576
+:- pred identify_recursive_calls601,23288
+identify_recursive_calls604,23406
+:- pred identify_out_and_out_prime626,24396
+identify_out_and_out_prime631,24631
+:- type accu_sets676,26425
+:- pred accu_stage1689,26977
+accu_stage1693,27155
+:- pred accu_stage1_2727,28347
+accu_stage1_2731,28515
+:- pred accu_sets_init781,30557
+accu_sets_init783,30605
+:- func set_upto796,30984
+set_upto798,31039
+:- pred accu_before812,31498
+accu_before815,31639
+:- pred accu_assoc835,32477
+accu_assoc838,32617
+:- pred accu_construct862,33712
+accu_construct865,33856
+:- pred accu_construct_assoc896,35307
+accu_construct_assoc899,35457
+:- pred accu_update938,37069
+accu_update941,37210
+:- pred member_lessthan_goalid964,38219
+member_lessthan_goalid967,38342
+:- type accu_assoc975,38652
+:- pred accu_is_associative986,39138
+accu_is_associative989,39250
+:- pred associativity_assertion1014,40263
+associativity_assertion1017,40404
+:- pred commutativity_assertion1037,41242
+commutativity_assertion1040,41369
+:- pred accu_is_update1057,41952
+accu_is_update1060,42066
+:- pred is_associative_construction1078,42802
+is_associative_construction1081,42898
+:- type accu_substs1095,43480
+:- type accu_base1103,43744
+:- pred accu_stage21124,44605
+accu_stage21131,44946
+:- pred accu_substs_init1179,46957
+accu_substs_init1182,47097
+:- pred acc_var_subst_init1194,47573
+acc_var_subst_init1198,47718
+:- pred create_new_var1207,48147
+create_new_var1210,48288
+:- pred accu_process_assoc_set1223,48862
+accu_process_assoc_set1229,49150
+:- pred accu_has_heuristic1297,52081
+accu_has_heuristic1299,52161
+:- pred accu_heuristic1304,52336
+accu_heuristic1307,52457
+:- pred accu_process_update_set1318,52906
+accu_process_update_set1325,53221
+:- pred accu_divide_base_case1380,55844
+accu_divide_base_case1385,56059
+:- pred accu_related1412,57146
+accu_related1415,57270
+:- inst stored_goal_plain_call1444,58415
+:- pred lookup_call1449,58601
+lookup_call1452,58715
+:- pred accu_stage31470,59432
+accu_stage31477,59826
+:- pred acc_proc_info1508,61326
+acc_proc_info1512,61485
+:- pred acc_pred_info1556,63449
+acc_pred_info1559,63597
+:- pred accu_create_goal1600,65285
+accu_create_goal1607,65628
+:- func create_acc_call1621,66400
+create_acc_call1625,66569
+:- pred create_orig_goal1634,66987
+create_orig_goal1638,67176
+:- pred create_acc_goal1662,68157
+create_acc_goal1667,68380
+:- func create_new_orig_recursive_goals1709,70225
+create_new_orig_recursive_goals1712,70368
+:- func create_new_recursive_goals1723,70918
+create_new_recursive_goals1727,71108
+:- func create_new_base_goals1738,71717
+create_new_base_goals1741,71831
+:- pred acc_unification1749,72156
+acc_unification1751,72225
+:- pred accu_top_level1766,72896
+accu_top_level1770,73058
+:- pred update_accumulator_pred1856,76290
+update_accumulator_pred1859,76411
+:- func accu_rename1876,77253
+accu_rename1879,77363
+:- func base_case_ids1889,77784
+base_case_ids1891,77846
+:- func base_case_ids_set1898,78048
+base_case_ids_set1900,78113
+:- func accu_goal_list1905,78269
+accu_goal_list1907,78349
+:- pred calculate_goal_info1916,78680
+calculate_goal_info1918,78753
+:- func chain_subst1932,79319
+chain_subst1934,79378
+:- pred chain_subst_21938,79482
+chain_subst_21941,79576
+:- some [T] pred unravel_univ1956,80060
+:- pragma foreign_export1957,80116
+unravel_univ1961,80340
 
 c-src/c.c,76
 T f(1,0
@@ -5160,13 +5315,13 @@ extern struct node *yylval;yylval306,6246
 unsigned char parse_cell_or_range 309,6291
 unsigned char parse_cell_or_range 311,6355
 yylex FUN0(315,6405
-parse_cell_or_range FUN2(587,11771
-#define CK_ABS_R(671,13213
-#define CK_REL_R(675,13292
-#define CK_ABS_C(680,13421
-#define CK_REL_C(684,13500
-#define MAYBEREL(689,13629
-str_to_col FUN1(847,16830
+parse_cell_or_range FUN2(587,11772
+#define CK_ABS_R(671,13214
+#define CK_REL_R(675,13293
+#define CK_ABS_C(680,13422
+#define CK_REL_C(684,13501
+#define MAYBEREL(689,13630
+str_to_col FUN1(847,16831
 
 y-src/parse.c,520
 #define YYBISON 4,64
diff --git a/test/manual/etags/Makefile b/test/manual/etags/Makefile
index c1df703..b3a82fd 100644
--- a/test/manual/etags/Makefile
+++ b/test/manual/etags/Makefile
@@ -16,6 +16,7 @@ HTMLSRC=$(addprefix ./html-src/,softwarelibero.html 
index.shtml algrthms.html so
 #JAVASRC=$(addprefix ./java-src/, )
 LUASRC=$(addprefix ./lua-src/,allegro.lua test.lua)
 MAKESRC=$(addprefix ./make-src/,Makefile)
+MERCSRC=$(addprefix ./merc-src/,accumulator.m)
 OBJCSRC=$(addprefix ./objc-src/,Subprocess.h Subprocess.m PackInsp.h 
PackInsp.m)
 OBJCPPSRC=$(addprefix ./objcpp-src/,SimpleCalc.H SimpleCalc.M)
 PASSRC=$(addprefix ./pas-src/,common.pas)
@@ -25,13 +26,14 @@ PSSRC=$(addprefix ./ps-src/,rfc1245.ps)
 PROLSRC=$(addprefix ./prol-src/,ordsets.prolog natded.prolog)
 PYTSRC=$(addprefix ./pyt-src/,server.py)
 RBSRC=$(addprefix ./ruby-src/,test.rb test1.ru)
+RSSRC=$(addprefix ./rs-src/,test.rs)
 SCMSRC=$(addprefix ./scm-src/,test.scm)
 TEXSRC=$(addprefix ./tex-src/,testenv.tex gzip.texi texinfo.tex nonewline.tex)
 YSRC=$(addprefix ./y-src/,parse.y parse.c atest.y cccp.c cccp.y)
 SRCS=${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
      ${FORTHSRC} ${GOSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC}\
      ${OBJCSRC} ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC}\
-     ${PROLSRC} ${PYTSRC} ${RBSRC} ${SCMSRC} ${TEXSRC} ${YSRC}
+     ${PROLSRC} ${PYTSRC} ${RBSRC} ${RSSRC} ${SCMSRC} ${TEXSRC} ${YSRC} 
${MERCSRC}
 NONSRCS=./f-src/entry.strange ./erl-src/lists.erl ./cp-src/clheir.hpp.gz
 
 ETAGS_PROG=../../../lib-src/etags
diff --git a/test/manual/etags/README b/test/manual/etags/README
new file mode 100644
index 0000000..7bce861
--- /dev/null
+++ b/test/manual/etags/README
@@ -0,0 +1,60 @@
+This directory contains the test suite for the 'etags' and 'ctags'
+programs.
+
+The input files, which include source files in various languages
+supported by the programs, are in the *-src/ directories (e.g., c-src
+for C sources, ada-src for Ada, tex-src for TeX, etc.).
+
+The expected results are slightly different for each of the 7 commands
+(see below) run by the test suite, and are on files ETAGS.good_N
+(where N is between 1 and 6) and CTAGS.good.
+
+To run the tests, say
+
+   make check
+
+in this directory.  This should run the programs 7 times with various
+command line switches, and should not show any differences between the
+produced file ETAGS/CTAGS and the corresponding expected results.  Any
+diffs shown by the 'diff' utility should be examined for potential
+regressions in 'etags' or 'ctags'.
+
+In some cases, diffs should be expected.  These include:
+
+  . adding new input files in the *-src/ directories
+  . routine changes in the existing input files, such as the yearly
+    update of copyright years, spelling changes, etc.
+  . adding new features to etags.c
+
+When the diffs are expected, they should be examined to make sure
+there are no regressions.  To do so, compare the line numbers and byte
+offsets shown in the new ETAGS/CTAGS files against the up-to-date
+input files, and make sure the new values match, whereas the old one
+don't.  Also make sure there no new or missing entries in the
+ETAGS/CTAGS files as compared with the expected results.  (When new
+input files are added, there obviously will be new entries -- these
+should be compared to the input files to verify correctness.)
+
+Once the differences are deemed to be justified, i.e. you decide that
+the new ETAGS/CTAGS file should become the new expected result, you
+should copy the ETAGS/CTAGS files produced by the test run to the
+corresponding "good" files, one by one.  Like this:
+
+  $ make check
+  $ cp ETAGS ETAGS.good_1
+  $ make check
+  $ cp ETAGS ETAGS.good_2
+  $ make check
+  $ cp ETAGS ETAGS.good_3
+  ...
+  $ make check
+  $ cp ETAGS ETAGS.good_6
+  $ make check
+  $ cp CTAGS CTAGS.good
+
+This uses the fact that "make check" will stop after the first
+failure, i.e. after the first time 'diff' reports any diffs, and then
+the ETAGS/CTAGS file from the last invocation is available for
+becoming the new expected-result file.  Alternatively, you can see the
+name of the expected-result file which needs to be updated in the
+output of the 'diff' utility.
diff --git a/test/manual/etags/merc-src/accumulator.m 
b/test/manual/etags/merc-src/accumulator.m
new file mode 100644
index 0000000..c82dbf5
--- /dev/null
+++ b/test/manual/etags/merc-src/accumulator.m
@@ -0,0 +1,1962 @@
+%---------------------------------------------------------------------------%
+% vim: ft=mercury ts=4 sw=4 et
+%---------------------------------------------------------------------------%
+% Copyright (C) 1999-2000,2002-2007, 2009-2012 The University of Melbourne.
+% Copyright (C) 2015 The Mercury team.
+% This file may only be copied under the terms of the GNU General
+% Public License - see the file COPYING in the Mercury distribution.
+%---------------------------------------------------------------------------%
+%
+% Module: accumulator.m.
+% Main authors: petdr.
+%
+% Attempts to transform a single proc to a tail recursive form by
+% introducing accumulators. The algorithm can do this if the code after
+% the recursive call has either the order independent state update or
+% associative property.
+%
+% /* Order independent State update property */
+% :- promise all [A,B,S0,S]
+%   (
+%       (some[SA] (update(A, S0, SA), update(B, SA, S)))
+%   <=>
+%       (some[SB] (update(B, S0, SB), update(A, SB, S)))
+%   ).
+%
+% /* Associativity property */
+% :- promise all [A,B,C,ABC]
+%   (
+%       (some[AB] (assoc(A, B, AB), assoc(AB, C, ABC)))
+%   <=>
+%       (some[BC] (assoc(B, C, BC), assoc(A, BC, ABC)))
+%   ).
+%
+% XXX What about exceptions and non-termination?
+%
+% The promise declarations above only provide promises about the declarative
+% semantics, but in order to apply this optimization, we ought to check that
+% it will preserve the operational semantics (modulo whatever changes are
+% allowed by the language semantics options).
+%
+% Currently we check and respect the --fully-strict option, but not the
+% --no-reorder-conj option. XXX we should check --no-reorder-conj!
+% If --no-reorder-conj was set, it would still be OK to apply this
+% transformation, but ONLY in cases where the goals which get reordered
+% are guaranteed not to throw any exceptions.
+%
+% The algorithm implemented is a combination of the algorithms from
+% "Making Mercury Programs Tail Recursive" and
+% "State Update Transformation", which can be found at
+% <http://www.cs.mu.oz.au/research/mercury/information/papers.html>.
+%
+% Note that currently "State Update Transformation" paper only resides
+% in CVS papers archive in the directory update, but has been submitted
+% to PPDP '00.
+%
+% The transformation recognises predicates in the form
+%
+% p(In, OutUpdate, OutAssoc) :-
+%   minimal(In),
+%   initialize(OutUpdate),
+%   base(OutAssoc).
+% p(In, OutUpdate, OutAssoc) :-
+%   decompose(In, Current, Rest),
+%   p(Rest, OutUpdate0, OutAssoc0),
+%   update(Current, OutUpdate0, OutUpdate),
+%   assoc(Current, OutAssoc0, OutAssoc).
+%
+% which can be transformed by the algorithm in "State Update Transformation" to
+%
+% p(In, OutUpdate, OutAssoc) :-
+%   initialize(AccUpdate),
+%   p_acc(In, OutUpdate, OutAssoc, AccUpdate).
+%
+% p_acc(In, OutUpdate, OutAssoc, AccUpdate) :-
+%   minimal(In),
+%   base(OutAssoc),
+%   OutUpdate = AccUpdate.
+% p_acc(In, OutUpdate, OutAssoc, AccUpdate0) :-
+%   decompose(In, Current, Rest),
+%   update(Current, AccUpdate0, AccUpdate),
+%   p_acc(Rest, OutUpdate, OutAssoc0, AccUpdate),
+%   assoc(Current, OutAssoc0, OutAssoc).
+%
+% we then apply the algorithm from "Making Mercury Programs Tail Recursive"
+% to p_acc to obtain
+%
+% p_acc(In, OutUpdate, OutAssoc, AccUpdate) :-
+%   minimal(In),
+%   base(OutAssoc),
+%   OutUpdate = AccUpdate.
+% p_acc(In, OutUpdate, OutAssoc, AccUpdate0) :-
+%   decompose(In, Current, Rest),
+%   update(Current, AccUpdate0, AccUpdate),
+%   p_acc2(Rest, OutUpdate, OutAssoc, AccUpdate, Current).
+%
+% p_acc2(In, OutUpdate, OutAssoc, AccUpdate0, AccAssoc0) :-
+%   minimal(In),
+%   base(Base),
+%   assoc(AccAssoc0, Base, OutAssoc),
+%   OutUpdate = AccUpdate0.
+% p_acc2(In, OutUpdate, OutAssoc, AccUpdate0, AccAssoc0) :-
+%   decompose(In, Current, Rest),
+%   update(Current, AccUpdate0, AccUpdate),
+%   assoc(AccAssoc0, Current, AccAssoc),
+%   p_acc2(Rest, OutUpdate, OutAssoc, AccUpdate, AccAssoc).
+%
+% p_acc is no longer recursive and is only ever called from p, so we
+% inline p_acc into p to obtain the final schema.
+%
+% p(In, OutUpdate, OutAssoc) :-
+%   minimal(In),
+%   base(OutAssoc),
+%   initialize(AccUpdate),
+%   OutUpdate = AccUpdate.
+% p(In, OutUpdate, OutAssoc) :-
+%   decompose(In, Current, Rest),
+%   initialize(AccUpdate0),
+%   update(Current, AccUpdate0, AccUpdate),
+%   p_acc2(Rest, OutUpdate, OutAssoc, AccUpdate, Current).
+%
+% p_acc2(In, OutUpdate, OutAssoc, AccUpdate0, AccAssoc0) :-
+%   minimal(In),
+%   base(Base),
+%   assoc(AccAssoc0, Base, OutAssoc),
+%   OutUpdate = AccUpdate0.
+% p_acc2(In, OutUpdate, OutAssoc, AccUpdate0, AccAssoc0) :-
+%   decompose(In, Current, Rest),
+%   update(Current, AccUpdate0, AccUpdate),
+%   assoc(AccAssoc0, Current, AccAssoc),
+%   p_acc2(Rest, OutUpdate, OutAssoc, AccUpdate, AccAssoc).
+%
+% The only real difficulty in this new transformation is identifying the
+% initialize/1 and base/1 goals from the original base case.
+%
+% Note that if the recursive clause contains multiple calls to p, the
+% transformation attempts to move each recursive call to the end
+% until one succeeds. This makes the order of independent recursive
+% calls in the body irrelevant.
+%
+% XXX Replace calls to can_reorder_goals with calls to the version that
+% use the intermodule-analysis framework.
+%
+%---------------------------------------------------------------------------%
+
+:- module transform_hlds.accumulator.
+:- interface.
+
+:- import_module hlds.
+:- import_module hlds.hlds_module.
+:- import_module hlds.hlds_pred.
+
+:- import_module univ.
+
+    % Attempt to transform a procedure into accumulator recursive form.
+    % If we succeed, we will add the recursive version of the procedure
+    % to the module_info. However, we may also encounter errors, which
+    % we will add to the list of error_specs in the univ accumulator.
+    %
+:- pred accu_transform_proc(pred_proc_id::in, pred_info::in,
+    proc_info::in, proc_info::out, module_info::in, module_info::out,
+    univ::in, univ::out) is det.
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- implementation.
+
+:- import_module hlds.assertion.
+:- import_module hlds.goal_util.
+:- import_module hlds.hlds_error_util.
+:- import_module hlds.hlds_goal.
+:- import_module hlds.hlds_out.
+:- import_module hlds.hlds_out.hlds_out_util.
+:- import_module hlds.hlds_promise.
+:- import_module hlds.instmap.
+:- import_module hlds.pred_table.
+:- import_module hlds.quantification.
+:- import_module hlds.status.
+:- import_module hlds.vartypes.
+:- import_module libs.
+:- import_module libs.globals.
+:- import_module libs.optimization_options.
+:- import_module libs.options.
+:- import_module mdbcomp.
+:- import_module mdbcomp.sym_name.
+:- import_module parse_tree.
+:- import_module parse_tree.error_util.
+:- import_module parse_tree.prog_data.
+:- import_module parse_tree.prog_mode.
+:- import_module parse_tree.prog_util.
+:- import_module parse_tree.set_of_var.
+:- import_module transform_hlds.goal_store.
+
+:- import_module assoc_list.
+:- import_module bool.
+:- import_module int.
+:- import_module io.
+:- import_module list.
+:- import_module map.
+:- import_module maybe.
+:- import_module pair.
+:- import_module require.
+:- import_module set.
+:- import_module solutions.
+:- import_module string.
+:- import_module term.
+:- import_module varset.
+
+%---------------------------------------------------------------------------%
+
+    % The form of the goal around the base and recursive cases.
+    %
+:- type top_level
+    --->    switch_base_rec
+    ;       switch_rec_base
+    ;       disj_base_rec
+    ;       disj_rec_base
+    ;       ite_base_rec
+    ;       ite_rec_base.
+
+    % An accu_goal_id represents a goal. The first field says which conjunction
+    % the goal came from (the base case or the recursive case), and the second
+    % gives the location of the goal in that conjunction.
+    %
+:- type accu_goal_id
+    --->    accu_goal_id(accu_case, int).
+
+:- type accu_case
+    --->    accu_base
+    ;       accu_rec.
+
+    % The goal_store associates a goal with each goal_id.
+    %
+:- type accu_goal_store == goal_store(accu_goal_id).
+
+    % A substitution from the first variable name to the second.
+    %
+:- type accu_subst == map(prog_var, prog_var).
+
+:- type accu_warning
+    --->    accu_warn(prog_context, pred_id, prog_var, prog_var).
+            % Warn that two prog_vars in a call to pred_id at the given context
+            % were swapped, which may cause an efficiency problem.
+
+%---------------------------------------------------------------------------%
+
+accu_transform_proc(proc(PredId, ProcId), PredInfo, !ProcInfo, !ModuleInfo,
+        !Cookie) :-
+    module_info_get_globals(!.ModuleInfo, Globals),
+    globals.get_opt_tuple(Globals, OptTuple),
+    DoLCMC = OptTuple ^ ot_opt_lcmc_accumulator,
+    globals.lookup_bool_option(Globals, fully_strict, FullyStrict),
+    ( if
+        should_attempt_accu_transform(!ModuleInfo, PredId, ProcId, PredInfo,
+            !ProcInfo, FullyStrict, DoLCMC, Warnings)
+    then
+        globals.lookup_bool_option(Globals, very_verbose, VeryVerbose),
+        (
+            VeryVerbose = yes,
+            trace [io(!IO)] (
+                module_info_get_name(!.ModuleInfo, ModuleName),
+                get_progress_output_stream(Globals, ModuleName,
+                    ProgressStream, !IO),
+                PredStr = pred_id_to_string(!.ModuleInfo, PredId),
+                io.format(ProgressStream,
+                    "%% Accumulators introduced into %s\n", [s(PredStr)], !IO)
+            )
+        ;
+            VeryVerbose = no
+        ),
+
+        (
+            Warnings = []
+        ;
+            Warnings = [_ | _],
+            pred_info_get_context(PredInfo, Context),
+            PredPieces = describe_one_pred_name(!.ModuleInfo,
+                should_module_qualify, PredId),
+            InPieces = [words("In") | PredPieces] ++ [suffix(":"), nl],
+            InMsg = simple_msg(Context,
+                [option_is_set(warn_accumulator_swaps, yes,
+                    [always(InPieces)])]),
+
+            proc_info_get_varset(!.ProcInfo, VarSet),
+            generate_warnings(!.ModuleInfo, VarSet, Warnings, WarnMsgs),
+            (
+                Warnings = [_],
+                EnsurePieces = [words("Please ensure that this"),
+                    words("argument rearrangement does not introduce"),
+                    words("performance problems.")]
+            ;
+                Warnings = [_, _ | _],
+                EnsurePieces = [words("Please ensure that these"),
+                    words("argument rearrangements do not introduce"),
+                    words("performance problems.")]
+            ),
+            SuppressPieces =
+                [words("These warnings can be suppressed by"),
+                quote("--no-warn-accumulator-swaps"), suffix(".")],
+            VerbosePieces = [words("If a predicate has been declared"),
+                words("associative"),
+                words("via a"), quote("promise"), words("declaration,"),
+                words("the compiler will rearrange the order of"),
+                words("the arguments in calls to that predicate,"),
+                words("if by so doing it makes the containing predicate"),
+                words("tail recursive. In such situations, the compiler"),
+                words("will issue this warning. If this reordering"),
+                words("changes the performance characteristics"),
+                words("of the call to the predicate, use"),
+                quote("--no-accumulator-introduction"),
+                words("to turn the optimization off, or "),
+                quote("--no-warn-accumulator-swaps"),
+                words("to turn off the warnings.")],
+            EnsureSuppressMsg = simple_msg(Context,
+                [option_is_set(warn_accumulator_swaps, yes,
+                    [always(EnsurePieces), always(SuppressPieces)]),
+                verbose_only(verbose_once, VerbosePieces)]),
+            Severity = severity_conditional(warn_accumulator_swaps, yes,
+                severity_warning, no),
+            Msgs = [InMsg | WarnMsgs] ++ [EnsureSuppressMsg],
+            Spec = error_spec($pred, Severity, phase_accumulator_intro, Msgs),
+
+            det_univ_to_type(!.Cookie, Specs0),
+            Specs = [Spec | Specs0],
+            type_to_univ(Specs, !:Cookie)
+        )
+    else
+        true
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- pred generate_warnings(module_info::in, prog_varset::in,
+    list(accu_warning)::in, list(error_msg)::out) is det.
+
+generate_warnings(_, _, [], []).
+generate_warnings(ModuleInfo, VarSet, [Warning | Warnings], [Msg | Msgs]) :-
+    generate_warning(ModuleInfo, VarSet, Warning, Msg),
+    generate_warnings(ModuleInfo, VarSet, Warnings, Msgs).
+
+:- pred generate_warning(module_info::in, prog_varset::in, accu_warning::in,
+    error_msg::out) is det.
+
+generate_warning(ModuleInfo, VarSet, Warning, Msg) :-
+    Warning = accu_warn(Context, PredId, VarA, VarB),
+    PredPieces = describe_one_pred_name(ModuleInfo, should_module_qualify,
+        PredId),
+
+    varset.lookup_name(VarSet, VarA, VarAName),
+    varset.lookup_name(VarSet, VarB, VarBName),
+
+    Pieces = [words("warning: the call to")] ++ PredPieces ++
+        [words("has had the location of the variables"),
+        quote(VarAName), words("and"), quote(VarBName),
+        words("swapped to allow accumulator introduction."), nl],
+    Msg = simplest_msg(Context, Pieces).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % should_attempt_accu_transform is only true iff the current proc
+    % has been transformed to call the newly created accumulator proc.
+    %
+:- pred should_attempt_accu_transform(module_info::in, module_info::out,
+    pred_id::in, proc_id::in, pred_info::in, proc_info::in, proc_info::out,
+    bool::in, maybe_opt_lcmc_accumulator::in,
+    list(accu_warning)::out) is semidet.
+
+should_attempt_accu_transform(!ModuleInfo, PredId, ProcId, PredInfo,
+        !ProcInfo, FullyStrict, DoLCMC, Warnings) :-
+    proc_info_get_goal(!.ProcInfo, Goal0),
+    proc_info_get_headvars(!.ProcInfo, HeadVars),
+    proc_info_get_initial_instmap(!.ModuleInfo, !.ProcInfo, InitialInstMap),
+    accu_standardize(Goal0, Goal),
+    identify_goal_type(PredId, ProcId, Goal, InitialInstMap,
+        TopLevel, Base, BaseInstMap, Rec, RecInstMap),
+
+    C = initialize_goal_store(Rec, RecInstMap, Base, BaseInstMap),
+    identify_recursive_calls(PredId, ProcId, C, RecCallIds),
+    list.length(Rec, M),
+
+    should_attempt_accu_transform_2(!ModuleInfo, PredId, PredInfo, !ProcInfo,
+        HeadVars, InitialInstMap, TopLevel, FullyStrict, DoLCMC,
+        RecCallIds, C, M, Rec, Warnings).
+
+    % should_attempt_accu_transform_2 takes a list of locations of the
+    % recursive calls, and attempts to introduce accumulator into each of the
+    % recursive calls, stopping at the first one that succeeds.
+    % This catches the following case, as selecting the first recursive call
+    % allows the second recursive call to be moved before it, and
+    % OutA is in the correct spot in list.append.
+    %
+    %   p(InA, OutA),
+    %   p(InB, OutB),
+    %   list.append(OutB, OutA, Out)
+    %
+:- pred should_attempt_accu_transform_2(module_info::in, module_info::out,
+    pred_id::in, pred_info::in, proc_info::in, proc_info::out,
+    list(prog_var)::in, instmap::in, top_level::in, bool::in,
+    maybe_opt_lcmc_accumulator::in,
+    list(accu_goal_id)::in, accu_goal_store::in, int::in, list(hlds_goal)::in,
+    list(accu_warning)::out) is semidet.
+
+should_attempt_accu_transform_2(!ModuleInfo, PredId, PredInfo, !ProcInfo,
+        HeadVars, InitialInstMap, TopLevel, FullyStrict, DoLCMC,
+        [Id | Ids], C, M, Rec, Warnings) :-
+    proc_info_get_vartypes(!.ProcInfo, VarTypes0),
+    identify_out_and_out_prime(!.ModuleInfo, VarTypes0, InitialInstMap,
+        Id, Rec, HeadVars, Out, OutPrime, HeadToCallSubst, CallToHeadSubst),
+    ( if
+        accu_stage1(!.ModuleInfo, VarTypes0, FullyStrict, DoLCMC, Id, M, C,
+            Sets),
+        accu_stage2(!.ModuleInfo, !.ProcInfo, Id, C, Sets, OutPrime, Out,
+            VarSet, VarTypes, Accs, BaseCase, BasePairs, Substs, CS,
+            WarningsPrime),
+        accu_stage3(Id, Accs, VarSet, VarTypes, C, CS, Substs,
+            HeadToCallSubst, CallToHeadSubst, BaseCase, BasePairs, Sets, Out,
+            TopLevel, PredId, PredInfo, !ProcInfo, !ModuleInfo)
+    then
+        Warnings = WarningsPrime
+    else
+        should_attempt_accu_transform_2(!ModuleInfo, PredId, PredInfo,
+            !ProcInfo, HeadVars, InitialInstMap, TopLevel, FullyStrict, DoLCMC,
+            Ids, C, M, Rec, Warnings)
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % Transform the goal into a standard form that is amenable to
+    % introducing accumulators.
+    %
+    % At the moment all this does is remove any extra disj/conj wrappers
+    % around the top level goal.
+    %
+    % Future work is for this code to rearrange code with multiple base
+    % and recursive cases into a single base and recursive case.
+    %
+:- pred accu_standardize(hlds_goal::in, hlds_goal::out) is det.
+
+accu_standardize(Goal0, Goal) :-
+    ( if
+        Goal0 = hlds_goal(GoalExpr0, _),
+        (
+            GoalExpr0 = conj(plain_conj, [Goal1])
+        ;
+            GoalExpr0 = disj([Goal1])
+        )
+    then
+        accu_standardize(Goal1, Goal)
+    else
+        Goal = Goal0
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % This predicate takes the original goal and identifies the `shape'
+    % of the goal around the recursive and base cases.
+    %
+    % Note that the base case can contain a recursive call, as the
+    % transformation doesn't depend on what is in the base case.
+    %
+:- pred identify_goal_type(pred_id::in, proc_id::in, hlds_goal::in,
+    instmap::in, top_level::out, list(hlds_goal)::out, instmap::out,
+    list(hlds_goal)::out, instmap::out) is semidet.
+
+identify_goal_type(PredId, ProcId, Goal, InitialInstMap, Type,
+        Base, BaseInstMap, Rec, RecInstMap) :-
+    Goal = hlds_goal(GoalExpr, _GoalInfo),
+    (
+        GoalExpr = switch(_Var, _CanFail, Cases),
+        ( if
+            Cases = [case(_IdA, [], GoalA), case(_IdB, [], GoalB)],
+            goal_to_conj_list(GoalA, GoalAList),
+            goal_to_conj_list(GoalB, GoalBList)
+        then
+            ( if is_recursive_case(GoalAList, proc(PredId, ProcId)) then
+                Type = switch_rec_base,
+                Base = GoalBList,
+                Rec = GoalAList
+            else if is_recursive_case(GoalBList, proc(PredId, ProcId)) then
+                Type = switch_base_rec,
+                Base = GoalAList,
+                Rec = GoalBList
+            else
+                fail
+            ),
+            BaseInstMap = InitialInstMap,
+            RecInstMap = InitialInstMap
+        else
+            fail
+        )
+    ;
+        GoalExpr = disj(Goals),
+        ( if
+            Goals = [GoalA, GoalB],
+            goal_to_conj_list(GoalA, GoalAList),
+            goal_to_conj_list(GoalB, GoalBList)
+        then
+            ( if is_recursive_case(GoalAList, proc(PredId, ProcId)) then
+                Type = disj_rec_base,
+                Base = GoalBList,
+                Rec = GoalAList
+            else if is_recursive_case(GoalBList, proc(PredId, ProcId)) then
+                Type = disj_base_rec,
+                Base = GoalAList,
+                Rec = GoalBList
+            else
+                fail
+            ),
+            BaseInstMap = InitialInstMap,
+            RecInstMap = InitialInstMap
+        else
+            fail
+        )
+    ;
+        GoalExpr = if_then_else(_Vars, Cond, Then, Else),
+        Cond = hlds_goal(_CondGoalExpr, CondGoalInfo),
+        CondInstMapDelta = goal_info_get_instmap_delta(CondGoalInfo),
+
+        goal_to_conj_list(Then, GoalAList),
+        goal_to_conj_list(Else, GoalBList),
+        ( if is_recursive_case(GoalAList, proc(PredId, ProcId)) then
+            Type = ite_rec_base,
+            Base = GoalBList,
+            Rec = GoalAList,
+
+            BaseInstMap = InitialInstMap,
+            apply_instmap_delta(CondInstMapDelta, InitialInstMap, RecInstMap)
+        else if is_recursive_case(GoalBList, proc(PredId, ProcId)) then
+            Type = ite_base_rec,
+            Base = GoalAList,
+            Rec = GoalBList,
+
+            RecInstMap = InitialInstMap,
+            apply_instmap_delta(CondInstMapDelta, InitialInstMap, BaseInstMap)
+        else
+            fail
+        )
+    ).
+
+    % is_recursive_case(Gs, Id) is true iff the list of goals, Gs,
+    % contains a call to the procedure specified by Id, where the call
+    % is located in a position that can be used by the transformation
+    % (i.e. not hidden in a compound goal).
+    %
+:- pred is_recursive_case(list(hlds_goal)::in, pred_proc_id::in) is semidet.
+
+is_recursive_case(Goals, proc(PredId, ProcId)) :-
+    list.append(_Initial, [RecursiveCall | _Final], Goals),
+    RecursiveCall = hlds_goal(plain_call(PredId, ProcId, _, _, _, _), _).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % The store info is folded over the list of goals which
+    % represent the base and recursive case conjunctions.
+:- type store_info
+    --->    store_info(
+                store_loc       :: int,
+                                % The location of the goal in the conjunction.
+                store_instmap   :: instmap,
+                store_goals     :: accu_goal_store
+            ).
+
+    % Initialise the goal_store, which will hold the C_{a,b} goals.
+    %
+:- func initialize_goal_store(list(hlds_goal), instmap,
+    list(hlds_goal), instmap) = accu_goal_store.
+
+initialize_goal_store(Rec, RecInstMap, Base, BaseInstMap) = C :-
+    goal_store_init(C0),
+    list.foldl3(accu_store(accu_rec), Rec,
+        1, _, RecInstMap, _, C0, C1),
+    list.foldl3(accu_store(accu_base), Base,
+        1, _, BaseInstMap, _, C1, C).
+
+:- pred accu_store(accu_case::in, hlds_goal::in,
+    int::in, int::out, instmap::in, instmap::out,
+    accu_goal_store::in, accu_goal_store::out) is det.
+
+accu_store(Case, Goal, !N, !InstMap, !GoalStore) :-
+    Id = accu_goal_id(Case, !.N),
+    goal_store_det_insert(Id, stored_goal(Goal, !.InstMap), !GoalStore),
+
+    !:N = !.N + 1,
+    Goal = hlds_goal(_, GoalInfo),
+    InstMapDelta = goal_info_get_instmap_delta(GoalInfo),
+    apply_instmap_delta(InstMapDelta, !InstMap).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % Determine the k's which are recursive calls.
+    % Note that this doesn't find recursive calls which are `hidden'
+    % in compound goals, this is not a problem as currently we can't use
+    % these to do transformation.
+    %
+:- pred identify_recursive_calls(pred_id::in, proc_id::in,
+    accu_goal_store::in, list(accu_goal_id)::out) is det.
+
+identify_recursive_calls(PredId, ProcId, GoalStore, Ids) :-
+    P =
+        ( pred(Key::out) is nondet :-
+            goal_store_member(GoalStore, Key, stored_goal(Goal, _InstMap)),
+            Key = accu_goal_id(accu_rec, _),
+            Goal = hlds_goal(plain_call(PredId, ProcId, _, _, _, _), _)
+        ),
+    solutions.solutions(P, Ids).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % Determine the variables which are members of the sets Out and Out',
+    % and initialize the substitutions between the two sets.
+    %
+    % This is done by identifing those variables whose instantiatedness change
+    % in the goals after the recursive call and are headvars.
+    %
+    % Note that we are only identifying the output variables which will need
+    % to be accumulated, as there may be other output variables which are
+    % produced prior to the recursive call.
+    %
+:- pred identify_out_and_out_prime(module_info::in, vartypes::in, instmap::in,
+    accu_goal_id::in, list(hlds_goal)::in,
+    list(prog_var)::in, list(prog_var)::out, list(prog_var)::out,
+    accu_subst::out, accu_subst::out) is det.
+
+identify_out_and_out_prime(ModuleInfo, VarTypes, InitialInstMap, GoalId,
+        Rec, HeadVars, Out, OutPrime, HeadToCallSubst, CallToHeadSubst) :-
+    GoalId = accu_goal_id(_Case, K),
+    ( if
+        list.take(K, Rec, InitialGoals),
+        list.drop(K-1, Rec, FinalGoals),
+        FinalGoals = [hlds_goal(plain_call(_, _, Args, _, _, _), _) | Rest]
+    then
+        goal_list_instmap_delta(InitialGoals, InitInstMapDelta),
+        apply_instmap_delta( InitInstMapDelta,
+            InitialInstMap, InstMapBeforeRest),
+
+        goal_list_instmap_delta(Rest, InstMapDelta),
+        apply_instmap_delta(InstMapDelta, InstMapBeforeRest, InstMapAfterRest),
+
+        instmap_changed_vars(ModuleInfo, VarTypes,
+            InstMapBeforeRest, InstMapAfterRest, ChangedVars),
+
+        assoc_list.from_corresponding_lists(HeadVars, Args, HeadArg0),
+
+        Member =
+            ( pred(M::in) is semidet :-
+                M = HeadVar - _,
+                set_of_var.member(ChangedVars, HeadVar)
+            ),
+        list.filter(Member, HeadArg0, HeadArg),
+        list.map(fst, HeadArg, Out),
+        list.map(snd, HeadArg, OutPrime),
+
+        map.from_assoc_list(HeadArg, HeadToCallSubst),
+
+        list.map((pred(X-Y::in, Y-X::out) is det), HeadArg, ArgHead),
+        map.from_assoc_list(ArgHead, CallToHeadSubst)
+    else
+        unexpected($pred, "test failed")
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % For each goal after the recursive call, we place that goal
+    % into a set according to what properties that goal has.
+    % For the definition of what goes into each set, inspect the documentation
+    % for the functions named before, assoc, and so on.
+    %
+:- type accu_sets
+    --->    accu_sets(
+                as_before           ::  set(accu_goal_id),
+                as_assoc            ::  set(accu_goal_id),
+                as_construct_assoc  ::  set(accu_goal_id),
+                as_construct        ::  set(accu_goal_id),
+                as_update           ::  set(accu_goal_id),
+                as_reject           ::  set(accu_goal_id)
+            ).
+
+    % Stage 1 is responsible for identifying which goals are associative,
+    % which can be moved before the recursive call and so on.
+    %
+:- pred accu_stage1(module_info::in, vartypes::in, bool::in,
+    maybe_opt_lcmc_accumulator::in, accu_goal_id::in, int::in,
+    accu_goal_store::in, accu_sets::out) is semidet.
+
+accu_stage1(ModuleInfo, VarTypes, FullyStrict, DoLCMC, GoalId, M, GoalStore,
+        Sets) :-
+    GoalId = accu_goal_id(Case, K),
+    NextGoalId = accu_goal_id(Case, K + 1),
+    accu_sets_init(Sets0),
+    accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+        GoalStore, Sets0, Sets1),
+    Sets1 = accu_sets(Before, Assoc,
+        ConstructAssoc, Construct, Update, Reject),
+    Sets = accu_sets(Before `set.union` set_upto(Case, K - 1), Assoc,
+        ConstructAssoc, Construct, Update, Reject),
+
+    % Continue the transformation only if the set reject is empty and
+    % the set assoc or update contains something that needs to be moved
+    % before the recursive call.
+    set.is_empty(Reject),
+    (
+        not set.is_empty(Assoc)
+    ;
+        not set.is_empty(Update)
+    ),
+    (
+        DoLCMC = do_not_opt_lcmc_accumulator,
+        % If LCMC is not turned on, then there must be no construction
+        % unifications after the recursive call.
+        set.is_empty(Construct),
+        set.is_empty(ConstructAssoc)
+    ;
+        DoLCMC = opt_lcmc_accumulator
+    ).
+
+    % For each goal after the recursive call decide which set
+    % the goal belongs to.
+    %
+:- pred accu_stage1_2(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, int::in, accu_goal_store::in,
+    accu_sets::in, accu_sets::out) is det.
+
+accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, GoalId, K, M, GoalStore,
+        !Sets) :-
+    GoalId = accu_goal_id(Case, I),
+    NextGoalId = accu_goal_id(Case, I + 1),
+    ( if I > M then
+        true
+    else
+        ( if
+            accu_before(ModuleInfo, VarTypes, FullyStrict, GoalId, K,
+                GoalStore, !.Sets)
+        then
+            !Sets ^ as_before := set.insert(!.Sets ^ as_before, GoalId),
+            accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+                GoalStore, !Sets)
+        else if
+            accu_assoc(ModuleInfo, VarTypes, FullyStrict, GoalId, K,
+                GoalStore, !.Sets)
+        then
+            !Sets ^ as_assoc := set.insert(!.Sets ^ as_assoc, GoalId),
+            accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+                GoalStore, !Sets)
+        else if
+            accu_construct(ModuleInfo, VarTypes, FullyStrict, GoalId, K,
+                GoalStore, !.Sets)
+        then
+            !Sets ^ as_construct := set.insert(!.Sets ^ as_construct, GoalId),
+            accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+                GoalStore, !Sets)
+        else if
+            accu_construct_assoc(ModuleInfo, VarTypes, FullyStrict, GoalId, K,
+                GoalStore, !.Sets)
+        then
+            !Sets ^ as_construct_assoc :=
+                set.insert(!.Sets ^ as_construct_assoc, GoalId),
+            accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+                GoalStore, !Sets)
+        else if
+            accu_update(ModuleInfo, VarTypes, FullyStrict, GoalId, K,
+                GoalStore, !.Sets)
+        then
+            !Sets ^ as_update := set.insert(!.Sets ^ as_update, GoalId),
+            accu_stage1_2(ModuleInfo, VarTypes, FullyStrict, NextGoalId, K, M,
+                GoalStore, !Sets)
+        else
+            !Sets ^ as_reject := set.insert(!.Sets ^ as_reject, GoalId)
+        )
+    ).
+
+%---------------------------------------------------------------------------%
+
+:- pred accu_sets_init(accu_sets::out) is det.
+
+accu_sets_init(Sets) :-
+    set.init(EmptySet),
+    Before = EmptySet,
+    Assoc = EmptySet,
+    ConstructAssoc = EmptySet,
+    Construct = EmptySet,
+    Update = EmptySet,
+    Reject = EmptySet,
+    Sets = accu_sets(Before, Assoc, ConstructAssoc, Construct, Update, Reject).
+
+    % set_upto(Case, K) returns the set
+    % {accu_goal_id(Case, 1) .. accu_goal_id(Case, K)}.
+    %
+:- func set_upto(accu_case, int) = set(accu_goal_id).
+
+set_upto(Case, K) = Set :-
+    ( if K =< 0 then
+        set.init(Set)
+    else
+        Set0 = set_upto(Case, K - 1),
+        set.insert(accu_goal_id(Case, K), Set0, Set)
+    ).
+
+%---------------------------------------------------------------------------%
+
+    % A goal is a member of the before set iff the goal only depends on goals
+    % which are before the recursive call or can be moved before the recursive
+    % call (member of the before set).
+    %
+:- pred accu_before(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, accu_goal_store::in, accu_sets::in) is semidet.
+
+accu_before(ModuleInfo, VarTypes, FullyStrict, GoalId, K, GoalStore, Sets) :-
+    GoalId = accu_goal_id(Case, _I),
+    Before = Sets ^ as_before,
+    goal_store_lookup(GoalStore, GoalId, stored_goal(LaterGoal, LaterInstMap)),
+    (
+        member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId,
+            stored_goal(EarlierGoal, EarlierInstMap)),
+        not can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
+            EarlierInstMap, EarlierGoal, LaterInstMap, LaterGoal)
+    )
+    =>
+    (
+        set.member(LessThanGoalId, set_upto(Case, K - 1) `union` Before)
+    ).
+
+    % A goal is a member of the assoc set iff the goal only depends on goals
+    % upto and including the recursive call and goals which can be moved
+    % before the recursive call (member of the before set) AND the goal
+    % is associative.
+    %
+:- pred accu_assoc(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, accu_goal_store::in, accu_sets::in) is semidet.
+
+accu_assoc(ModuleInfo, VarTypes, FullyStrict, GoalId, K, GoalStore, Sets) :-
+    GoalId = accu_goal_id(Case, _I),
+    Before = Sets ^ as_before,
+    goal_store_lookup(GoalStore, GoalId, stored_goal(LaterGoal, LaterInstMap)),
+    LaterGoal = hlds_goal(plain_call(PredId, _, Args, _, _, _), _),
+    accu_is_associative(ModuleInfo, PredId, Args, _),
+    (
+        % XXX LessThanGoalId was _N - J, not N - J: it ignored the case.
+        % See the diff with the previous version.
+        member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId,
+            stored_goal(EarlierGoal, EarlierInstMap)),
+        not can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
+            EarlierInstMap, EarlierGoal, LaterInstMap, LaterGoal)
+    )
+    =>
+    (
+        set.member(LessThanGoalId, set_upto(Case, K) `union` Before)
+    ).
+
+    % A goal is a member of the construct set iff the goal only depends
+    % on goals upto and including the recursive call and goals which
+    % can be moved before the recursive call (member of the before set)
+    % AND the goal is construction unification.
+    %
+:- pred accu_construct(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, accu_goal_store::in, accu_sets::in) is semidet.
+
+accu_construct(ModuleInfo, VarTypes, FullyStrict, GoalId, K, GoalStore,
+        Sets) :-
+    GoalId = accu_goal_id(Case, _I),
+    Before = Sets ^ as_before,
+    Construct = Sets ^ as_construct,
+    goal_store_lookup(GoalStore, GoalId, stored_goal(LaterGoal, LaterInstMap)),
+    LaterGoal = hlds_goal(unify(_, _, _, Unify, _), _GoalInfo),
+    Unify = construct(_, _, _, _, _, _, _),
+    (
+        % XXX LessThanGoalId was _N - J, not N - J: it ignored the case.
+        % See the diff with the previous version.
+        member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId,
+            stored_goal(EarlierGoal, EarlierInstMap)),
+        not can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
+            EarlierInstMap, EarlierGoal, LaterInstMap, LaterGoal)
+    )
+    =>
+    (
+        set.member(LessThanGoalId,
+            set_upto(Case, K) `union` Before `union` Construct)
+    ).
+
+    % A goal is a member of the construct_assoc set iff the goal depends only
+    % on goals upto and including the recursive call and goals which can be
+    % moved before the recursive call (member of the before set) and goals
+    % which are associative AND the goal is construction unification AND
+    % there is only one member of the assoc set which the construction
+    % unification depends on AND the construction unification can be expressed
+    % as a call to the member of the assoc set which the construction
+    % unification depends on.
+    %
+:- pred accu_construct_assoc(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, accu_goal_store::in, accu_sets::in) is semidet.
+
+accu_construct_assoc(ModuleInfo, VarTypes, FullyStrict,
+        GoalId, K, GoalStore, Sets) :-
+    GoalId = accu_goal_id(Case, _I),
+    Before = Sets ^ as_before,
+    Assoc = Sets ^ as_assoc,
+    ConstructAssoc = Sets ^ as_construct_assoc,
+    goal_store_lookup(GoalStore, GoalId, stored_goal(LaterGoal, LaterInstMap)),
+    LaterGoal = hlds_goal(unify(_, _, _, Unify, _), _GoalInfo),
+    Unify = construct(_, ConsId, _, _, _, _, _),
+
+    goal_store_all_ancestors(GoalStore, GoalId, VarTypes, ModuleInfo,
+        FullyStrict, Ancestors),
+
+    set.is_singleton(Assoc `intersect` Ancestors, AssocId),
+    goal_store_lookup(GoalStore, AssocId,
+        stored_goal(AssocGoal, _AssocInstMap)),
+    AssocGoal = hlds_goal(plain_call(PredId, _, _, _, _, _), _),
+
+    is_associative_construction(ModuleInfo, PredId, ConsId),
+    (
+        % XXX LessThanGoalId was _N - J, not N - J: it ignored the case.
+        % See the diff with the previous version.
+        member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId,
+            stored_goal(EarlierGoal, EarlierInstMap)),
+        not can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
+            EarlierInstMap, EarlierGoal, LaterInstMap, LaterGoal)
+    )
+    =>
+    (
+        set.member(LessThanGoalId,
+            set_upto(Case, K) `union` Before `union` Assoc
+            `union` ConstructAssoc)
+    ).
+
+    % A goal is a member of the update set iff the goal only depends
+    % on goals upto and including the recursive call and goals which
+    % can be moved before the recursive call (member of the before set)
+    % AND the goal updates some state.
+    %
+:- pred accu_update(module_info::in, vartypes::in, bool::in,
+    accu_goal_id::in, int::in, accu_goal_store::in, accu_sets::in) is semidet.
+
+accu_update(ModuleInfo, VarTypes, FullyStrict, GoalId, K, GoalStore, Sets) :-
+    GoalId = accu_goal_id(Case, _I),
+    Before = Sets ^ as_before,
+    goal_store_lookup(GoalStore, GoalId, stored_goal(LaterGoal, LaterInstMap)),
+    LaterGoal = hlds_goal(plain_call(PredId, _, Args, _, _, _), _),
+    accu_is_update(ModuleInfo, PredId, Args, _),
+    (
+        % XXX LessThanGoalId was _N - J, not N - J: it ignored the case.
+        % See the diff with the previous version.
+        member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId,
+            stored_goal(EarlierGoal, EarlierInstMap)),
+        not can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
+            EarlierInstMap, EarlierGoal, LaterInstMap, LaterGoal)
+    )
+    =>
+    (
+        set.member(LessThanGoalId, set_upto(Case, K) `union` Before)
+    ).
+
+    % member_lessthan_goalid(GS, IdA, IdB, GB) is true iff the goal_id, IdB,
+    % and its associated goal, GB, is a member of the goal_store, GS,
+    % and IdB is less than IdA.
+    %
+:- pred member_lessthan_goalid(accu_goal_store::in,
+    accu_goal_id::in, accu_goal_id::out, stored_goal::out) is nondet.
+
+member_lessthan_goalid(GoalStore, GoalId, LessThanGoalId, LessThanGoal) :-
+    goal_store_member(GoalStore, LessThanGoalId, LessThanGoal),
+    GoalId = accu_goal_id(Case, I),
+    LessThanGoalId = accu_goal_id(Case, J),
+    J < I.
+
+%---------------------------------------------------------------------------%
+
+:- type accu_assoc
+    --->    accu_assoc(
+                set_of_progvar,     % the associative input args
+                prog_var,           % the corresponding output arg
+                bool                % is the predicate commutative?
+            ).
+
+    % If accu_is_associative is true, it returns the two arguments which are
+    % associative and the variable which depends on those two arguments,
+    % and an indicator of whether or not the predicate is commutative.
+    %
+:- pred accu_is_associative(module_info::in, pred_id::in, list(prog_var)::in,
+    accu_assoc::out) is semidet.
+
+accu_is_associative(ModuleInfo, PredId, Args, Result) :-
+    module_info_pred_info(ModuleInfo, PredId, PredInfo),
+    pred_info_get_assertions(PredInfo, Assertions),
+    AssertionsList = set.to_sorted_list(Assertions),
+    associativity_assertion(ModuleInfo, AssertionsList, Args,
+        AssociativeVarsOutputVar),
+    ( if
+        commutativity_assertion(ModuleInfo, AssertionsList, Args,
+            _CommutativeVars)
+    then
+        IsCommutative = yes
+    else
+        IsCommutative = no
+    ),
+    AssociativeVarsOutputVar =
+        associative_vars_output_var(AssociativeVars, OutputVar),
+    Result = accu_assoc(AssociativeVars, OutputVar, IsCommutative).
+
+    % Does there exist one (and only one) associativity assertion for the
+    % current predicate?
+    % The 'and only one condition' is required because we currently
+    % do not handle the case of predicates which have individual parts
+    % which are associative, because then we do not know which variable
+    % is descended from which.
+    %
+:- pred associativity_assertion(module_info::in, list(assert_id)::in,
+    list(prog_var)::in, associative_vars_output_var::out) is semidet.
+
+associativity_assertion(ModuleInfo, [AssertId | AssertIds], Args0,
+        AssociativeVarsOutputVar) :-
+    ( if
+        assertion.is_associativity_assertion(ModuleInfo, AssertId,
+            Args0, AssociativeVarsOutputVarPrime)
+    then
+        AssociativeVarsOutputVar = AssociativeVarsOutputVarPrime,
+        not associativity_assertion(ModuleInfo, AssertIds, Args0, _)
+    else
+        associativity_assertion(ModuleInfo, AssertIds, Args0,
+            AssociativeVarsOutputVar)
+    ).
+
+    % Does there exist one (and only one) commutativity assertion for the
+    % current predicate?
+    % The 'and only one condition' is required because we currently
+    % do not handle the case of predicates which have individual
+    % parts which are commutative, because then we do not know which variable
+    % is descended from which.
+    %
+:- pred commutativity_assertion(module_info::in,list(assert_id)::in,
+    list(prog_var)::in, set_of_progvar::out) is semidet.
+
+commutativity_assertion(ModuleInfo, [AssertId | AssertIds], Args0,
+        CommutativeVars) :-
+    ( if
+        assertion.is_commutativity_assertion(ModuleInfo, AssertId,
+            Args0, CommutativeVarsPrime)
+    then
+        CommutativeVars = CommutativeVarsPrime,
+        not commutativity_assertion(ModuleInfo, AssertIds, Args0, _)
+    else
+        commutativity_assertion(ModuleInfo, AssertIds, Args0,
+            CommutativeVars)
+    ).
+
+%---------------------------------------------------------------------------%
+
+    % Does the current predicate update some state?
+    %
+:- pred accu_is_update(module_info::in, pred_id::in, list(prog_var)::in,
+    state_update_vars::out) is semidet.
+
+accu_is_update(ModuleInfo, PredId, Args, ResultStateVars) :-
+    module_info_pred_info(ModuleInfo, PredId, PredInfo),
+    pred_info_get_assertions(PredInfo, Assertions),
+    list.filter_map(
+        ( pred(AssertId::in, StateVars::out) is semidet :-
+            assertion.is_update_assertion(ModuleInfo, AssertId,
+                PredId, Args, StateVars)
+        ),
+        set.to_sorted_list(Assertions), Result),
+    % XXX Maybe we should just match on the first result,
+    % just in case there are duplicate promises.
+    Result = [ResultStateVars].
+
+%---------------------------------------------------------------------------%
+
+    % Can the construction unification be expressed as a call to the
+    % specified predicate.
+    %
+:- pred is_associative_construction(module_info::in, pred_id::in, cons_id::in)
+    is semidet.
+
+is_associative_construction(ModuleInfo, PredId, ConsId) :-
+    module_info_pred_info(ModuleInfo, PredId, PredInfo),
+    pred_info_get_assertions(PredInfo, Assertions),
+    list.filter(
+        ( pred(AssertId::in) is semidet :-
+            assertion.is_construction_equivalence_assertion(ModuleInfo,
+                AssertId, ConsId, PredId)
+        ),
+        set.to_sorted_list(Assertions), Result),
+    Result = [_ | _].
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- type accu_substs
+    --->    accu_substs(
+                acc_var_subst       :: accu_subst,
+                rec_call_subst      :: accu_subst,
+                assoc_call_subst    :: accu_subst,
+                update_subst        :: accu_subst
+            ).
+
+:- type accu_base
+    --->    accu_base(
+                % goals which initialize update
+                init_update         :: set(accu_goal_id),
+
+                % goals which initialize assoc
+                init_assoc          :: set(accu_goal_id),
+
+                % other goals
+                other               :: set(accu_goal_id)
+            ).
+
+    % Stage 2 is responsible for identifying the substitutions which
+    % are needed to mimic the unfold/fold process that was used as
+    % the justification of the algorithm in the paper.
+    % It is also responsible for ensuring that the reordering of arguments
+    % doesn't worsen the big-O complexity of the procedure.
+    % It also divides the base case into goals that initialize the
+    % variables used by the update goals, and those used by the assoc
+    % goals and then all the rest.
+    %
+:- pred accu_stage2(module_info::in, proc_info::in,
+    accu_goal_id::in, accu_goal_store::in, accu_sets::in,
+    list(prog_var)::in, list(prog_var)::in, prog_varset::out, vartypes::out,
+    list(prog_var)::out, accu_base::out, list(pair(prog_var))::out,
+    accu_substs::out, accu_goal_store::out, list(accu_warning)::out)
+    is semidet.
+
+accu_stage2(ModuleInfo, ProcInfo0, GoalId, GoalStore, Sets, OutPrime, Out,
+        !:VarSet, !:VarTypes, Accs, BaseCase, BasePairs, !:Substs,
+        CS, Warnings) :-
+    Sets = accu_sets(Before0, Assoc, ConstructAssoc, Construct, Update, _),
+    GoalId = accu_goal_id(Case, K),
+    Before = Before0 `union` set_upto(Case, K-1),
+
+    % Note Update set is not placed in the after set, as the after set is used
+    % to determine the variables that need to be accumulated for the
+    % associative calls.
+    After = Assoc `union` ConstructAssoc `union` Construct,
+
+    P =
+        ( pred(Id::in, Set0::in, Set::out) is det :-
+            goal_store_lookup(GoalStore, Id, stored_goal(Goal, _InstMap)),
+            Goal = hlds_goal(_GoalExpr, GoalInfo),
+            NonLocals = goal_info_get_nonlocals(GoalInfo),
+            set_of_var.union(NonLocals, Set0, Set)
+        ),
+    list.foldl(P, set.to_sorted_list(Before),
+        set_of_var.init, BeforeNonLocals),
+    list.foldl(P, set.to_sorted_list(After),
+        set_of_var.init, AfterNonLocals),
+    InitAccs = set_of_var.intersect(BeforeNonLocals, AfterNonLocals),
+
+    proc_info_get_varset(ProcInfo0, !:VarSet),
+    proc_info_get_vartypes(ProcInfo0, !:VarTypes),
+
+    accu_substs_init(set_of_var.to_sorted_list(InitAccs), !VarSet, !VarTypes,
+        !:Substs),
+
+    set_of_var.list_to_set(OutPrime, OutPrimeSet),
+    accu_process_assoc_set(ModuleInfo, GoalStore, set.to_sorted_list(Assoc),
+        OutPrimeSet, !Substs, !VarSet, !VarTypes, CS, Warnings),
+
+    accu_process_update_set(ModuleInfo, GoalStore, set.to_sorted_list(Update),
+        OutPrimeSet, !Substs, !VarSet, !VarTypes, UpdateOut, UpdateAccOut,
+        BasePairs),
+
+    Accs = set_of_var.to_sorted_list(InitAccs) ++ UpdateAccOut,
+
+    accu_divide_base_case(ModuleInfo, !.VarTypes, GoalStore, UpdateOut, Out,
+        UpdateBase, AssocBase, OtherBase),
+
+    BaseCase = accu_base(UpdateBase, AssocBase, OtherBase).
+
+%---------------------------------------------------------------------------%
+
+:- pred accu_substs_init(list(prog_var)::in, prog_varset::in, prog_varset::out,
+    vartypes::in, vartypes::out, accu_substs::out) is det.
+
+accu_substs_init(InitAccs, !VarSet, !VarTypes, Substs) :-
+    map.init(Subst),
+    acc_var_subst_init(InitAccs, !VarSet, !VarTypes, AccVarSubst),
+    RecCallSubst = Subst,
+    AssocCallSubst = Subst,
+    UpdateSubst = Subst,
+    Substs = accu_substs(AccVarSubst, RecCallSubst, AssocCallSubst,
+        UpdateSubst).
+
+    % Initialise the acc_var_subst to be from Var to A_Var where Var is a
+    % member of InitAccs and A_Var is a fresh variable of the same type of Var.
+    %
+:- pred acc_var_subst_init(list(prog_var)::in,
+    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,
+    accu_subst::out) is det.
+
+acc_var_subst_init([], !VarSet, !VarTypes, map.init).
+acc_var_subst_init([Var | Vars], !VarSet, !VarTypes, Subst) :-
+    create_new_var(Var, "A_", AccVar, !VarSet, !VarTypes),
+    acc_var_subst_init(Vars, !VarSet, !VarTypes, Subst0),
+    map.det_insert(Var, AccVar, Subst0, Subst).
+
+    % Create a fresh variable which is the same type as the old variable
+    % and has the same name except that it begins with the prefix.
+    %
+:- pred create_new_var(prog_var::in, string::in, prog_var::out,
+    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.
+
+create_new_var(OldVar, Prefix, NewVar, !VarSet, !VarTypes) :-
+    varset.lookup_name(!.VarSet, OldVar, OldName),
+    string.append(Prefix, OldName, NewName),
+    varset.new_named_var(NewName, NewVar, !VarSet),
+    lookup_var_type(!.VarTypes, OldVar, Type),
+    add_var_type(NewVar, Type, !VarTypes).
+
+%---------------------------------------------------------------------------%
+
+    % For each member of the assoc set determine the substitutions needed,
+    % and also check the efficiency of the procedure isn't worsened
+    % by reordering the arguments to a call.
+    %
+:- pred accu_process_assoc_set(module_info::in, accu_goal_store::in,
+    list(accu_goal_id)::in, set_of_progvar::in,
+    accu_substs::in, accu_substs::out,
+    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,
+    accu_goal_store::out, list(accu_warning)::out) is semidet.
+
+accu_process_assoc_set(_ModuleInfo, _GS, [], _OutPrime, !Substs,
+        !VarSet, !VarTypes, CS, []) :-
+    goal_store_init(CS).
+accu_process_assoc_set(ModuleInfo, GS, [Id | Ids], OutPrime, !Substs,
+        !VarSet, !VarTypes, CS, Warnings) :-
+    !.Substs = accu_substs(AccVarSubst, RecCallSubst0, AssocCallSubst0,
+        UpdateSubst),
+
+    lookup_call(GS, Id, stored_goal(Goal, InstMap)),
+
+    Goal = hlds_goal(plain_call(PredId, _, Args, _, _, _), GoalInfo),
+    accu_is_associative(ModuleInfo, PredId, Args, AssocInfo),
+    AssocInfo = accu_assoc(Vars, AssocOutput, IsCommutative),
+    OutPrimeVars = set_of_var.intersect(Vars, OutPrime),
+    set_of_var.is_singleton(OutPrimeVars, DuringAssocVar),
+    set_of_var.is_singleton(set_of_var.difference(Vars, OutPrimeVars),
+        BeforeAssocVar),
+
+    map.lookup(AccVarSubst, BeforeAssocVar, AccVar),
+    create_new_var(BeforeAssocVar, "NewAcc_", NewAcc, !VarSet, !VarTypes),
+
+    map.det_insert(DuringAssocVar, AccVar, AssocCallSubst0, AssocCallSubst1),
+    map.det_insert(AssocOutput, NewAcc, AssocCallSubst1, AssocCallSubst),
+    map.det_insert(DuringAssocVar, AssocOutput, RecCallSubst0, RecCallSubst1),
+    map.det_insert(BeforeAssocVar, NewAcc, RecCallSubst1, RecCallSubst),
+
+    !:Substs = accu_substs(AccVarSubst, RecCallSubst, AssocCallSubst,
+        UpdateSubst),
+
+    % ONLY swap the order of the variables if the goal is
+    % associative and not commutative.
+    (
+        IsCommutative = yes,
+        CSGoal = stored_goal(Goal, InstMap),
+        CurWarnings = []
+    ;
+        IsCommutative = no,
+
+        % Ensure that the reordering doesn't cause a efficiency problem.
+        module_info_pred_info(ModuleInfo, PredId, PredInfo),
+        ModuleName = pred_info_module(PredInfo),
+        PredName = pred_info_name(PredInfo),
+        Arity = pred_info_orig_arity(PredInfo),
+        ( if accu_has_heuristic(ModuleName, PredName, Arity) then
+            % Only do the transformation if the accumulator variable is
+            % *not* in a position where it will control the running time
+            % of the predicate.
+            accu_heuristic(ModuleName, PredName, Arity, Args,
+                PossibleDuringAssocVars),
+            set_of_var.member(PossibleDuringAssocVars, DuringAssocVar),
+            CurWarnings = []
+        else
+            ProgContext = goal_info_get_context(GoalInfo),
+            CurWarnings = [accu_warn(ProgContext, PredId, BeforeAssocVar,
+                DuringAssocVar)]
+        ),
+        % Swap the arguments.
+        [A, B] = set_of_var.to_sorted_list(Vars),
+        map.from_assoc_list([A - B, B - A], Subst),
+        rename_some_vars_in_goal(Subst, Goal, SwappedGoal),
+        CSGoal = stored_goal(SwappedGoal, InstMap)
+    ),
+
+    accu_process_assoc_set(ModuleInfo, GS, Ids, OutPrime, !Substs,
+        !VarSet, !VarTypes, CS0, Warnings0),
+    goal_store_det_insert(Id, CSGoal, CS0, CS),
+    Warnings = Warnings0 ++ CurWarnings.
+
+:- pred accu_has_heuristic(module_name::in, string::in, arity::in) is semidet.
+
+accu_has_heuristic(unqualified("list"), "append", 3).
+
+    % heuristic returns the set of which head variables are important
+    % in the running time of the predicate.
+    %
+:- pred accu_heuristic(module_name::in, string::in, arity::in,
+    list(prog_var)::in, set_of_progvar::out) is semidet.
+
+accu_heuristic(unqualified("list"), "append", 3, [_Typeinfo, A, _B, _C],
+        Set) :-
+    set_of_var.make_singleton(A, Set).
+
+%---------------------------------------------------------------------------%
+
+    % For each member of the update set determine the substitutions needed
+    % (creating the accumulator variables when needed).
+    % Also associate with each Output variable which accumulator variable
+    % to get the result from.
+    %
+:- pred accu_process_update_set(module_info::in, accu_goal_store::in,
+    list(accu_goal_id)::in, set_of_progvar::in,
+    accu_substs::in, accu_substs::out,
+    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,
+    list(prog_var)::out, list(prog_var)::out, list(pair(prog_var))::out)
+    is semidet.
+
+accu_process_update_set(_ModuleInfo, _GS, [], _OutPrime, !Substs,
+        !VarSet, !VarTypes, [], [], []).
+accu_process_update_set(ModuleInfo, GS, [Id | Ids], OutPrime, !Substs,
+        !VarSet, !VarTypes, StateOutputVars, Accs, BasePairs) :-
+    !.Substs = accu_substs(AccVarSubst0, RecCallSubst0, AssocCallSubst,
+        UpdateSubst0),
+    lookup_call(GS, Id, stored_goal(Goal, _InstMap)),
+
+    Goal = hlds_goal(plain_call(PredId, _, Args, _, _, _), _GoalInfo),
+    accu_is_update(ModuleInfo, PredId, Args, StateVars),
+    StateVars = state_update_vars(StateVarA, StateVarB),
+
+    ( if set_of_var.member(OutPrime, StateVarA) then
+        StateInputVar = StateVarA,
+        StateOutputVar = StateVarB
+    else
+        StateInputVar = StateVarB,
+        StateOutputVar = StateVarA
+    ),
+
+    create_new_var(StateInputVar, "Acc_", Acc0, !VarSet, !VarTypes),
+    create_new_var(StateOutputVar, "Acc_", Acc, !VarSet, !VarTypes),
+
+    map.det_insert(StateInputVar, Acc0, UpdateSubst0, UpdateSubst1),
+    map.det_insert(StateOutputVar, Acc, UpdateSubst1, UpdateSubst),
+    map.det_insert(StateInputVar, StateOutputVar, RecCallSubst0, RecCallSubst),
+    map.det_insert(Acc, Acc0, AccVarSubst0, AccVarSubst),
+    !:Substs = accu_substs(AccVarSubst, RecCallSubst, AssocCallSubst,
+        UpdateSubst),
+
+    accu_process_update_set(ModuleInfo, GS, Ids, OutPrime, !Substs,
+        !VarSet, !VarTypes, StateOutputVars0, Accs0, BasePairs0),
+
+    % Rather then concatenating to start of the list we concatenate to the end
+    % of the list. This allows the accumulator introduction to be applied
+    % as the heuristic will succeed (remember after transforming the two
+    % input variables will have their order swapped, so they must be in the
+    % inefficient order to start with)
+
+    StateOutputVars = StateOutputVars0 ++ [StateOutputVar],
+    Accs = Accs0 ++ [Acc],
+    BasePairs = BasePairs0 ++ [StateOutputVar - Acc0].
+
+%---------------------------------------------------------------------------%
+
+    % divide_base_case(UpdateOut, Out, U, A, O) is true iff given the output
+    % variables which are instantiated by update goals, UpdateOut, and all
+    % the variables that need to be accumulated, Out, divide the base case up
+    % into three sets, those base case goals which initialize the variables
+    % used by update calls, U, those which initialize variables used by
+    % assoc calls, A, and the rest of the goals, O. Note that the sets
+    % are not necessarily disjoint, as the result of a goal may be used
+    % to initialize a variable in both U and A, so both U and A will contain
+    % the same goal_id.
+    %
+:- pred accu_divide_base_case(module_info::in, vartypes::in,
+    accu_goal_store::in, list(prog_var)::in, list(prog_var)::in,
+    set(accu_goal_id)::out, set(accu_goal_id)::out, set(accu_goal_id)::out)
+    is det.
+
+accu_divide_base_case(ModuleInfo, VarTypes, C, UpdateOut, Out,
+        UpdateBase, AssocBase, OtherBase) :-
+    list.delete_elems(Out, UpdateOut, AssocOut),
+
+    list.map(accu_related(ModuleInfo, VarTypes, C), UpdateOut, UpdateBaseList),
+    list.map(accu_related(ModuleInfo, VarTypes, C), AssocOut, AssocBaseList),
+    UpdateBase = set.power_union(set.list_to_set(UpdateBaseList)),
+    AssocBase = set.power_union(set.list_to_set(AssocBaseList)),
+
+    Set = base_case_ids_set(C) `difference` (UpdateBase `union` AssocBase),
+    set.to_sorted_list(Set, List),
+
+    list.map(
+        ( pred(GoalId::in, Ancestors::out) is det :-
+            goal_store_all_ancestors(C, GoalId, VarTypes,
+                ModuleInfo, no, Ancestors)
+        ), List, OtherBaseList),
+
+    OtherBase = set.list_to_set(List) `union`
+        (base_case_ids_set(C) `intersect`
+        set.power_union(set.list_to_set(OtherBaseList))).
+
+    % accu_related(ModuleInfo, VarTypes, GoalStore, Var, Related):
+    %
+    % From GoalStore, return all the goal_ids, Related, which are needed
+    % to initialize Var.
+    %
+:- pred accu_related(module_info::in, vartypes::in, accu_goal_store::in,
+    prog_var::in, set(accu_goal_id)::out) is det.
+
+accu_related(ModuleInfo, VarTypes, GoalStore, Var, Related) :-
+    solutions.solutions(
+        ( pred(Key::out) is nondet :-
+            goal_store_member(GoalStore, Key, stored_goal(Goal, InstMap0)),
+            Key = accu_goal_id(accu_base, _),
+            Goal = hlds_goal(_GoalExpr, GoalInfo),
+            InstMapDelta = goal_info_get_instmap_delta(GoalInfo),
+            apply_instmap_delta(InstMapDelta, InstMap0, InstMap),
+            instmap_changed_vars(ModuleInfo, VarTypes,
+                InstMap0, InstMap, ChangedVars),
+            set_of_var.is_singleton(ChangedVars, Var)
+        ), Ids),
+    (
+        Ids = [],
+        unexpected($pred, "no Id")
+    ;
+        Ids = [Id],
+        goal_store_all_ancestors(GoalStore, Id, VarTypes, ModuleInfo, no,
+            Ancestors),
+        list.filter((pred(accu_goal_id(accu_base, _)::in) is semidet),
+            set.to_sorted_list(set.insert(Ancestors, Id)), RelatedList),
+        Related = set.list_to_set(RelatedList)
+    ;
+        Ids = [_, _ | _],
+        unexpected($pred, "more than one Id")
+    ).
+
+%---------------------------------------------------------------------------%
+
+:- inst stored_goal_plain_call for goal_store.stored_goal/0
+    --->    stored_goal(goal_plain_call, ground).
+
+    % Do a goal_store_lookup where the result is known to be a call.
+    %
+:- pred lookup_call(accu_goal_store::in, accu_goal_id::in,
+    stored_goal::out(stored_goal_plain_call)) is det.
+
+lookup_call(GoalStore, Id, stored_goal(Call, InstMap)) :-
+    goal_store_lookup(GoalStore, Id, stored_goal(Goal, InstMap)),
+    ( if
+        Goal = hlds_goal(GoalExpr, GoalInfo),
+        GoalExpr = plain_call(_, _, _, _, _, _)
+    then
+        Call = hlds_goal(GoalExpr, GoalInfo)
+    else
+        unexpected($pred, "not a call")
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % accu_stage3 creates the accumulator version of the predicate using
+    % the substitutions determined in stage2. It also redefines the
+    % original procedure to call the accumulator version of the procedure.
+    %
+:- pred accu_stage3(accu_goal_id::in, list(prog_var)::in, prog_varset::in,
+    vartypes::in, accu_goal_store::in, accu_goal_store::in,
+    accu_substs::in, accu_subst::in, accu_subst::in,
+    accu_base::in, list(pair(prog_var))::in, accu_sets::in,
+    list(prog_var)::in, top_level::in, pred_id::in, pred_info::in,
+    proc_info::in, proc_info::out, module_info::in, module_info::out) is det.
+
+accu_stage3(RecCallId, Accs, VarSet, VarTypes, C, CS, Substs,
+        HeadToCallSubst, CallToHeadSubst, BaseCase, BasePairs, Sets, Out,
+        TopLevel, OrigPredId, OrigPredInfo, !OrigProcInfo, !ModuleInfo) :-
+    acc_proc_info(Accs, VarSet, VarTypes, Substs, !.OrigProcInfo,
+        AccTypes, AccProcInfo),
+    acc_pred_info(AccTypes, Out, AccProcInfo, OrigPredId, OrigPredInfo,
+        AccProcId, AccPredInfo),
+    AccName = unqualified(pred_info_name(AccPredInfo)),
+
+    module_info_get_predicate_table(!.ModuleInfo, PredTable0),
+    predicate_table_insert(AccPredInfo, AccPredId, PredTable0, PredTable),
+    module_info_set_predicate_table(PredTable, !ModuleInfo),
+    accu_create_goal(RecCallId, Accs, AccPredId, AccProcId, AccName, Substs,
+        HeadToCallSubst, CallToHeadSubst, BaseCase, BasePairs, Sets, C, CS,
+        OrigBaseGoal, OrigRecGoal, AccBaseGoal, AccRecGoal),
+
+    proc_info_get_goal(!.OrigProcInfo, OrigGoal0),
+    accu_top_level(TopLevel, OrigGoal0, OrigBaseGoal, OrigRecGoal,
+        AccBaseGoal, AccRecGoal, OrigGoal, AccGoal),
+
+    proc_info_set_goal(OrigGoal, !OrigProcInfo),
+    proc_info_set_varset(VarSet, !OrigProcInfo),
+    proc_info_set_vartypes(VarTypes, !OrigProcInfo),
+
+    requantify_proc_general(ordinary_nonlocals_no_lambda, !OrigProcInfo),
+    update_accumulator_pred(AccPredId, AccProcId, AccGoal, !ModuleInfo).
+
+%---------------------------------------------------------------------------%
+
+    % Construct a proc_info for the introduced predicate.
+    %
+:- pred acc_proc_info(list(prog_var)::in, prog_varset::in, vartypes::in,
+    accu_substs::in, proc_info::in, list(mer_type)::out, proc_info::out)
+    is det.
+
+acc_proc_info(Accs0, VarSet, VarTypes, Substs, OrigProcInfo,
+        AccTypes, AccProcInfo) :-
+    % ProcInfo Stuff that must change.
+    proc_info_get_headvars(OrigProcInfo, HeadVars0),
+    proc_info_get_argmodes(OrigProcInfo, HeadModes0),
+
+    proc_info_get_inst_varset(OrigProcInfo, InstVarSet),
+    proc_info_get_inferred_determinism(OrigProcInfo, Detism),
+    proc_info_get_goal(OrigProcInfo, Goal),
+    proc_info_get_context(OrigProcInfo, Context),
+    proc_info_get_rtti_varmaps(OrigProcInfo, RttiVarMaps),
+    proc_info_get_is_address_taken(OrigProcInfo, IsAddressTaken),
+    proc_info_get_has_parallel_conj(OrigProcInfo, HasParallelConj),
+    proc_info_get_var_name_remap(OrigProcInfo, VarNameRemap),
+
+    Substs = accu_substs(AccVarSubst, _RecCallSubst, _AssocCallSubst,
+        _UpdateSubst),
+    list.map(map.lookup(AccVarSubst), Accs0, Accs),
+
+    % We place the extra accumulator variables at the start, because placing
+    % them at the end breaks the convention that the last variable of a
+    % function is the output variable.
+    HeadVars = Accs ++ HeadVars0,
+
+    % XXX we don't want to use the inst of the var as it can be more specific
+    % than it should be. ie int_const(1) when it should be any integer.
+    % However this will no longer handle partially instantiated data
+    % structures.
+    Inst = ground(shared, none_or_default_func),
+    inst_lists_to_mode_list([Inst], [Inst], Mode),
+    list.duplicate(list.length(Accs), list.det_head(Mode), AccModes),
+    HeadModes = AccModes ++ HeadModes0,
+
+    lookup_var_types(VarTypes, Accs, AccTypes),
+
+    SeqNum = item_no_seq_num,
+    proc_info_create(Context, SeqNum, VarSet, VarTypes, HeadVars,
+        InstVarSet, HeadModes, detism_decl_none, Detism, Goal, RttiVarMaps,
+        IsAddressTaken, HasParallelConj, VarNameRemap, AccProcInfo).
+
+%---------------------------------------------------------------------------%
+
+    % Construct the pred_info for the introduced predicate.
+    %
+:- pred acc_pred_info(list(mer_type)::in, list(prog_var)::in, proc_info::in,
+    pred_id::in, pred_info::in, proc_id::out, pred_info::out) is det.
+
+acc_pred_info(NewTypes, OutVars, NewProcInfo, OrigPredId, OrigPredInfo,
+        NewProcId, NewPredInfo) :-
+    % PredInfo stuff that must change.
+    pred_info_get_arg_types(OrigPredInfo, TypeVarSet, ExistQVars, Types0),
+
+    ModuleName = pred_info_module(OrigPredInfo),
+    Name = pred_info_name(OrigPredInfo),
+    PredOrFunc = pred_info_is_pred_or_func(OrigPredInfo),
+    pred_info_get_context(OrigPredInfo, PredContext),
+    pred_info_get_markers(OrigPredInfo, Markers),
+    pred_info_get_class_context(OrigPredInfo, ClassContext),
+    pred_info_get_origin(OrigPredInfo, OldOrigin),
+    pred_info_get_var_name_remap(OrigPredInfo, VarNameRemap),
+
+    set.init(Assertions),
+
+    proc_info_get_context(NewProcInfo, Context),
+    term.context_line(Context, Line),
+    Counter = 0,
+
+    Types = NewTypes ++ Types0,
+
+    make_pred_name_with_context(ModuleName, "AccFrom", PredOrFunc, Name,
+        Line, Counter, SymName),
+
+    OutVarNums = list.map(term.var_to_int, OutVars),
+    Origin = origin_transformed(transform_accumulator(OutVarNums),
+        OldOrigin, OrigPredId),
+    GoalType = goal_not_for_promise(np_goal_type_none),
+    pred_info_create(ModuleName, SymName, PredOrFunc, PredContext, Origin,
+        pred_status(status_local), Markers, Types, TypeVarSet,
+        ExistQVars, ClassContext, Assertions, VarNameRemap, GoalType,
+        NewProcInfo, NewProcId, NewPredInfo).
+
+%---------------------------------------------------------------------------%
+
+    % create_goal creates the new base and recursive case of the
+    % original procedure (OrigBaseGoal and OrigRecGoal) and the base
+    % and recursive cases of accumulator version (AccBaseGoal and
+    % AccRecGoal).
+    %
+:- pred accu_create_goal(accu_goal_id::in, list(prog_var)::in,
+    pred_id::in, proc_id::in, sym_name::in, accu_substs::in,
+    accu_subst::in, accu_subst::in, accu_base::in,
+    list(pair(prog_var))::in, accu_sets::in,
+    accu_goal_store::in, accu_goal_store::in,
+    hlds_goal::out, hlds_goal::out, hlds_goal::out, hlds_goal::out) is det.
+
+accu_create_goal(RecCallId, Accs, AccPredId, AccProcId, AccName, Substs,
+        HeadToCallSubst, CallToHeadSubst, BaseIds, BasePairs,
+        Sets, C, CS, OrigBaseGoal, OrigRecGoal, AccBaseGoal, AccRecGoal) :-
+    lookup_call(C, RecCallId, stored_goal(OrigCall, _InstMap)),
+    Call = create_acc_call(OrigCall, Accs, AccPredId, AccProcId, AccName),
+    create_orig_goal(Call, Substs, HeadToCallSubst, CallToHeadSubst,
+        BaseIds, Sets, C, OrigBaseGoal, OrigRecGoal),
+    create_acc_goal(Call, Substs, HeadToCallSubst, BaseIds, BasePairs,
+        Sets, C, CS, AccBaseGoal, AccRecGoal).
+
+    % create_acc_call takes the original call and generates a call to the
+    % accumulator version of the call, which can have the substitutions
+    % applied to it easily.
+    %
+:- func create_acc_call(hlds_goal::in(goal_plain_call), list(prog_var)::in,
+    pred_id::in, proc_id::in, sym_name::in) = (hlds_goal::out(goal_plain_call))
+    is det.
+
+create_acc_call(OrigCall, Accs, AccPredId, AccProcId, AccName) = Call :-
+    OrigCall = hlds_goal(OrigCallExpr, GoalInfo),
+    OrigCallExpr = plain_call(_PredId, _ProcId, Args, Builtin, Context, _Name),
+    CallExpr = plain_call(AccPredId, AccProcId, Accs ++ Args, Builtin,
+        Context, AccName),
+    Call = hlds_goal(CallExpr, GoalInfo).
+
+    % Create the goals which are to replace the original predicate.
+    %
+:- pred create_orig_goal(hlds_goal::in, accu_substs::in,
+    accu_subst::in, accu_subst::in, accu_base::in, accu_sets::in,
+    accu_goal_store::in, hlds_goal::out, hlds_goal::out) is det.
+
+create_orig_goal(Call, Substs, HeadToCallSubst, CallToHeadSubst,
+        BaseIds, Sets, C, OrigBaseGoal, OrigRecGoal) :-
+    Substs = accu_substs(_AccVarSubst, _RecCallSubst, _AssocCallSubst,
+        UpdateSubst),
+
+    BaseIds = accu_base(UpdateBase, _AssocBase, _OtherBase),
+    Before = Sets ^ as_before,
+    Update = Sets ^ as_update,
+
+    U = create_new_orig_recursive_goals(UpdateBase, Update,
+        HeadToCallSubst, UpdateSubst, C),
+
+    rename_some_vars_in_goal(CallToHeadSubst, Call, BaseCall),
+    Cbefore = accu_goal_list(set.to_sorted_list(Before), C),
+    Uupdate = accu_goal_list(set.to_sorted_list(UpdateBase) ++
+        set.to_sorted_list(Update), U),
+    Cbase = accu_goal_list(base_case_ids(C), C),
+    calculate_goal_info(conj(plain_conj, Cbefore ++ Uupdate ++ [BaseCall]),
+        OrigRecGoal),
+    calculate_goal_info(conj(plain_conj, Cbase), OrigBaseGoal).
+
+    % Create the goals which are to go in the new accumulator version
+    % of the predicate.
+    %
+:- pred create_acc_goal(hlds_goal::in, accu_substs::in, accu_subst::in,
+    accu_base::in, list(pair(prog_var))::in, accu_sets::in,
+    accu_goal_store::in, accu_goal_store::in,
+    hlds_goal::out, hlds_goal::out) is det.
+
+create_acc_goal(Call, Substs, HeadToCallSubst, BaseIds, BasePairs, Sets,
+        C, CS, AccBaseGoal, AccRecGoal) :-
+    Substs = accu_substs(AccVarSubst, RecCallSubst, AssocCallSubst,
+        UpdateSubst),
+
+    BaseIds = accu_base(_UpdateBase, AssocBase, OtherBase),
+    Sets = accu_sets(Before, Assoc, ConstructAssoc, Construct, Update,
+        _Reject),
+
+    rename_some_vars_in_goal(RecCallSubst, Call, RecCall),
+
+    Cbefore = accu_goal_list(set.to_sorted_list(Before), C),
+
+    % Create the goals which will be used in the new recursive case.
+    R = create_new_recursive_goals(Assoc, Construct `union` ConstructAssoc,
+        Update, AssocCallSubst, AccVarSubst, UpdateSubst, C, CS),
+
+    Rassoc = accu_goal_list(set.to_sorted_list(Assoc), R),
+    Rupdate = accu_goal_list(set.to_sorted_list(Update), R),
+    Rconstruct = accu_goal_list(set.to_sorted_list(Construct `union`
+        ConstructAssoc), R),
+
+    % Create the goals which will be used in the new base case.
+    B = create_new_base_goals(Assoc `union` Construct `union`
+        ConstructAssoc, C, AccVarSubst, HeadToCallSubst),
+    Bafter = set.to_sorted_list(Assoc `union`
+        Construct `union` ConstructAssoc),
+
+    BaseCase = accu_goal_list(set.to_sorted_list(AssocBase `union` OtherBase)
+        ++ Bafter, B),
+
+    list.map(acc_unification, BasePairs, UpdateBase),
+
+    calculate_goal_info(conj(plain_conj, Cbefore ++ Rassoc ++ Rupdate
+        ++ [RecCall] ++ Rconstruct), AccRecGoal),
+    calculate_goal_info(conj(plain_conj, UpdateBase ++ BaseCase), AccBaseGoal).
+
+    % Create the U set of goals (those that will be used in the original
+    % recursive case) by renaming all the goals which are used to initialize
+    % the update state variable using the head_to_call followed by the
+    % update_subst, and rename all the update goals using the update_subst.
+    %
+:- func create_new_orig_recursive_goals(set(accu_goal_id), set(accu_goal_id),
+    accu_subst, accu_subst, accu_goal_store) = accu_goal_store.
+
+create_new_orig_recursive_goals(UpdateBase, Update, HeadToCallSubst,
+        UpdateSubst, C)
+        = accu_rename(set.to_sorted_list(Update), UpdateSubst, C, Ubase) :-
+    Ubase = accu_rename(set.to_sorted_list(UpdateBase),
+        chain_subst(HeadToCallSubst, UpdateSubst), C, goal_store_init).
+
+    % Create the R set of goals (those that will be used in the new
+    % recursive case) by renaming all the members of assoc in CS
+    % using assoc_call_subst and all the members of (construct U
+    % construct_assoc) in C with acc_var_subst.
+    %
+:- func create_new_recursive_goals(set(accu_goal_id), set(accu_goal_id),
+    set(accu_goal_id), accu_subst, accu_subst, accu_subst,
+    accu_goal_store, accu_goal_store) = accu_goal_store.
+
+create_new_recursive_goals(Assoc, Constructs, Update,
+        AssocCallSubst, AccVarSubst, UpdateSubst, C, CS)
+        = accu_rename(set.to_sorted_list(Constructs), AccVarSubst, C, RBase) :-
+    RBase0 = accu_rename(set.to_sorted_list(Assoc), AssocCallSubst, CS,
+        goal_store_init),
+    RBase = accu_rename(set.to_sorted_list(Update), UpdateSubst, C, RBase0).
+
+    % Create the B set of goals (those that will be used in the new base case)
+    % by renaming all the base case goals of C with head_to_call and all the
+    % members of (assoc U construct U construct_assoc) of C with acc_var_subst.
+    %
+:- func create_new_base_goals(set(accu_goal_id), accu_goal_store,
+    accu_subst, accu_subst) = accu_goal_store.
+
+create_new_base_goals(Ids, C, AccVarSubst, HeadToCallSubst)
+        = accu_rename(set.to_sorted_list(Ids), AccVarSubst, C, Bbase) :-
+    Bbase = accu_rename(base_case_ids(C), HeadToCallSubst, C, goal_store_init).
+
+    % acc_unification(O-A, G):
+    %
+    % is true if G represents the assignment unification Out = Acc.
+    %
+:- pred acc_unification(pair(prog_var)::in, hlds_goal::out) is det.
+
+acc_unification(Out - Acc, Goal) :-
+    UnifyMode = unify_modes_li_lf_ri_rf(free, ground_inst,
+        ground_inst, ground_inst),
+    Context = unify_context(umc_explicit, []),
+    Expr = unify(Out, rhs_var(Acc), UnifyMode, assign(Out,Acc), Context),
+    set_of_var.list_to_set([Out, Acc], NonLocalVars),
+    InstMapDelta = instmap_delta_bind_var(Out),
+    goal_info_init(NonLocalVars, InstMapDelta, detism_det, purity_pure, Info),
+    Goal = hlds_goal(Expr, Info).
+
+%---------------------------------------------------------------------------%
+
+    % Given the top level structure of the goal create new version
+    % with new base and recursive cases plugged in.
+    %
+:- pred accu_top_level(top_level::in, hlds_goal::in,
+    hlds_goal::in, hlds_goal::in, hlds_goal::in,
+    hlds_goal::in, hlds_goal::out, hlds_goal::out) is det.
+
+accu_top_level(TopLevel, Goal, OrigBaseGoal, OrigRecGoal,
+        NewBaseGoal, NewRecGoal, OrigGoal, NewGoal) :-
+    (
+        TopLevel = switch_base_rec,
+        ( if
+            Goal = hlds_goal(switch(Var, CanFail, Cases0), GoalInfo),
+            Cases0 = [case(IdA, [], _), case(IdB, [], _)]
+        then
+            OrigCases = [case(IdA, [], OrigBaseGoal),
+                case(IdB, [], OrigRecGoal)],
+            OrigGoal = hlds_goal(switch(Var, CanFail, OrigCases), GoalInfo),
+
+            NewCases = [case(IdA, [], NewBaseGoal), case(IdB, [], NewRecGoal)],
+            NewGoal = hlds_goal(switch(Var, CanFail, NewCases), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ;
+        TopLevel = switch_rec_base,
+        ( if
+            Goal = hlds_goal(switch(Var, CanFail, Cases0), GoalInfo),
+            Cases0 = [case(IdA, [], _), case(IdB, [], _)]
+        then
+            OrigCases = [case(IdA, [], OrigRecGoal),
+                case(IdB, [], OrigBaseGoal)],
+            OrigGoal = hlds_goal(switch(Var, CanFail, OrigCases), GoalInfo),
+
+            NewCases = [case(IdA, [], NewRecGoal), case(IdB, [], NewBaseGoal)],
+            NewGoal = hlds_goal(switch(Var, CanFail, NewCases), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ;
+        TopLevel = disj_base_rec,
+        ( if
+            Goal = hlds_goal(disj(Goals), GoalInfo),
+            Goals = [_, _]
+        then
+            OrigGoals = [OrigBaseGoal, OrigRecGoal],
+            OrigGoal = hlds_goal(disj(OrigGoals), GoalInfo),
+
+            NewGoals = [NewBaseGoal, NewRecGoal],
+            NewGoal = hlds_goal(disj(NewGoals), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ;
+        TopLevel = disj_rec_base,
+        ( if
+            Goal = hlds_goal(disj(Goals), GoalInfo),
+            Goals = [_, _]
+        then
+            OrigGoals = [OrigRecGoal, OrigBaseGoal],
+            OrigGoal = hlds_goal(disj(OrigGoals), GoalInfo),
+
+            NewGoals = [NewRecGoal, NewBaseGoal],
+            NewGoal = hlds_goal(disj(NewGoals), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ;
+        TopLevel = ite_base_rec,
+        ( if Goal = hlds_goal(if_then_else(Vars, Cond, _, _), GoalInfo) then
+            OrigGoal = hlds_goal(if_then_else(Vars, Cond,
+                OrigBaseGoal, OrigRecGoal), GoalInfo),
+            NewGoal = hlds_goal(if_then_else(Vars, Cond,
+                NewBaseGoal, NewRecGoal), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ;
+        TopLevel = ite_rec_base,
+        ( if Goal = hlds_goal(if_then_else(Vars, Cond, _, _), GoalInfo) then
+            OrigGoal = hlds_goal(if_then_else(Vars, Cond,
+                OrigRecGoal, OrigBaseGoal), GoalInfo),
+            NewGoal = hlds_goal(if_then_else(Vars, Cond,
+                NewRecGoal, NewBaseGoal), GoalInfo)
+        else
+            unexpected($pred, "not the correct top level")
+        )
+    ).
+
+%---------------------------------------------------------------------------%
+
+    % Place the accumulator version of the predicate in the HLDS.
+    %
+:- pred update_accumulator_pred(pred_id::in, proc_id::in,
+    hlds_goal::in, module_info::in, module_info::out) is det.
+
+update_accumulator_pred(NewPredId, NewProcId, AccGoal, !ModuleInfo) :-
+    module_info_pred_proc_info(!.ModuleInfo, NewPredId, NewProcId,
+        PredInfo, ProcInfo0),
+    proc_info_set_goal(AccGoal, ProcInfo0, ProcInfo1),
+    requantify_proc_general(ordinary_nonlocals_no_lambda, ProcInfo1, ProcInfo),
+    module_info_set_pred_proc_info(NewPredId, NewProcId,
+        PredInfo, ProcInfo, !ModuleInfo).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+    % accu_rename(Ids, Subst, From, Initial):
+    %
+    % Return a goal_store, Final, which is the result of looking up each
+    % member of set of goal_ids, Ids, in the goal_store, From, applying
+    % the substitution and then storing the goal into the goal_store, Initial.
+    %
+:- func accu_rename(list(accu_goal_id), accu_subst,
+    accu_goal_store, accu_goal_store) = accu_goal_store.
+
+accu_rename(Ids, Subst, From, Initial) = Final :-
+    list.foldl(
+        ( pred(Id::in, GS0::in, GS::out) is det :-
+            goal_store_lookup(From, Id, stored_goal(Goal0, InstMap)),
+            rename_some_vars_in_goal(Subst, Goal0, Goal),
+            goal_store_det_insert(Id, stored_goal(Goal, InstMap), GS0, GS)
+        ), Ids, Initial, Final).
+
+    % Return all the goal_ids which belong in the base case.
+    %
+:- func base_case_ids(accu_goal_store) = list(accu_goal_id).
+
+base_case_ids(GS) = Base :-
+    solutions.solutions(
+        ( pred(Key::out) is nondet :-
+            goal_store_member(GS, Key, _Goal),
+            Key = accu_goal_id(accu_base, _)
+        ), Base).
+
+:- func base_case_ids_set(accu_goal_store) = set(accu_goal_id).
+
+base_case_ids_set(GS) = set.list_to_set(base_case_ids(GS)).
+
+    % Given a list of goal_ids, return the list of hlds_goals from
+    % the goal_store.
+    %
+:- func accu_goal_list(list(accu_goal_id), accu_goal_store) = list(hlds_goal).
+
+accu_goal_list(Ids, GS) = Goals :-
+    list.map(
+        ( pred(Key::in, G::out) is det :-
+            goal_store_lookup(GS, Key, stored_goal(G, _))
+        ), Ids, Goals).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- pred calculate_goal_info(hlds_goal_expr::in, hlds_goal::out) is det.
+
+calculate_goal_info(GoalExpr, hlds_goal(GoalExpr, GoalInfo)) :-
+    ( if GoalExpr = conj(plain_conj, GoalList) then
+        goal_list_nonlocals(GoalList, NonLocals),
+        goal_list_instmap_delta(GoalList, InstMapDelta),
+        goal_list_determinism(GoalList, Detism),
+
+        goal_info_init(NonLocals, InstMapDelta, Detism, purity_pure, GoalInfo)
+    else
+        unexpected($pred, "not a conj")
+    ).
+
+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- func chain_subst(accu_subst, accu_subst) = accu_subst.
+
+chain_subst(AtoB, BtoC) = AtoC :-
+    map.keys(AtoB, Keys),
+    chain_subst_2(Keys, AtoB, BtoC, AtoC).
+
+:- pred chain_subst_2(list(A)::in, map(A, B)::in, map(B, C)::in,
+    map(A, C)::out) is det.
+
+chain_subst_2([], _, _, AtoC) :-
+    map.init(AtoC).
+chain_subst_2([A | As], AtoB, BtoC, AtoC) :-
+    chain_subst_2(As, AtoB, BtoC, AtoC0),
+    map.lookup(AtoB, A, B),
+    ( if map.search(BtoC, B, C) then
+        map.det_insert(A, C, AtoC0, AtoC)
+    else
+        AtoC = AtoC0
+    ).
+
+%---------------------------------------------------------------------------%
+:- end_module transform_hlds.accumulator.
+%---------------------------------------------------------------------------%
+
+:- some [T] pred unravel_univ(univ::in, T::out) is det.
+:- pragma foreign_export("C", unravel_univ(in, out), "ML_unravel_univ").
+:- pragma foreign_export("C#", unravel_univ(in, out), "ML_unravel_univ").
+:- pragma foreign_export("Java", unravel_univ(in, out), "ML_unravel_univ").
+
+unravel_univ(Univ, X) :-
+    univ_value(Univ) = X.
diff --git a/test/manual/etags/rs-src/test.rs b/test/manual/etags/rs-src/test.rs
new file mode 100644
index 0000000..081d0d7
--- /dev/null
+++ b/test/manual/etags/rs-src/test.rs
@@ -0,0 +1,14 @@
+mod test;
+
+enum IpAddrKind {
+    V4,
+    V6,
+}
+
+fn test1() {
+   println!("Testing");
+}
+
+fn main() {
+   test::test1();
+}
diff --git a/test/manual/indent/scss-mode.scss 
b/test/manual/indent/scss-mode.scss
index 189ec4e..2cd4adb 100644
--- a/test/manual/indent/scss-mode.scss
+++ b/test/manual/indent/scss-mode.scss
@@ -1,5 +1,7 @@
 // Comment!
 
+@use "sass:math";
+
 nav {
     ul {
         margin: 0;              /* More comment */
@@ -44,8 +46,8 @@ article[role="main"] {
     $var_with_underscores: #fff;
     $_var-starting-with-underscore: none;
     float: left !important;
-    width: 600px / 888px * 100%;
-    height: 100px / 888px * 100%;
+    width: math.div(600px, 888px) * 100%;
+    height: math.div(100px, 888px) * 100%;
     color: $var_with_underscores;
     display: $_var-starting-with-underscore;
 }
diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el
index ba8b8b0..fb9441e 100644
--- a/test/src/comp-tests.el
+++ b/test/src/comp-tests.el
@@ -33,7 +33,7 @@
 
 (defconst comp-test-dyn-src (ert-resource-file "comp-test-funcs-dyn.el"))
 
-(when (featurep 'nativecomp)
+(when (featurep 'native-compile)
   (require 'comp)
   (message "Compiling tests...")
   (load (native-compile comp-test-src))
@@ -53,13 +53,13 @@
   "Compile the compiler and load it to compile it-self.
 Check that the resulting binaries do not differ."
   :tags '(:expensive-test :nativecomp)
-  (let* ((byte-native-for-bootstrap t) ; FIXME HACK
+  (let* ((byte+native-compile t) ; FIXME HACK
          (comp-src (expand-file-name "../../../lisp/emacs-lisp/comp.el"
                                      (ert-resource-directory)))
          (comp1-src (make-temp-file "stage1-" nil ".el"))
          (comp2-src (make-temp-file "stage2-" nil ".el"))
          ;; Can't use debug symbols.
-         (comp-debug 0))
+         (native-comp-debug 0))
     (copy-file comp-src comp1-src t)
     (copy-file comp-src comp2-src t)
     (let ((load-no-native t))
@@ -786,7 +786,7 @@ Return a list of results."
 
 (comp-deftest tco ()
   "Check for tail recursion elimination."
-  (let ((comp-speed 3)
+  (let ((native-comp-speed 3)
         ;; Disable ipa-pure otherwise `comp-tests-tco-f' gets
         ;; optimized-out.
         (comp-disabled-passes '(comp-ipa-pure))
@@ -814,7 +814,7 @@ Return a list of results."
 
 (comp-deftest fw-prop-1 ()
   "Some tests for forward propagation."
-  (let ((comp-speed 2)
+  (let ((native-comp-speed 2)
         (comp-post-pass-hooks '((comp-final comp-tests-fw-prop-checker-1))))
     (eval '(defun comp-tests-fw-prop-1-f ()
              (let* ((a "xxx")
@@ -828,7 +828,7 @@ Return a list of results."
 
 (defun comp-tests-check-ret-type-spec (func-form ret-type)
   (let ((lexical-binding t)
-        (comp-speed 2)
+        (native-comp-speed 2)
         (f-name (cl-second func-form)))
     (eval func-form t)
     (native-compile f-name)
@@ -1399,7 +1399,7 @@ Return a list of results."
 
 (comp-deftest pure ()
   "Some tests for pure functions optimization."
-  (let ((comp-speed 3)
+  (let ((native-comp-speed 3)
         (comp-post-pass-hooks '((comp-final comp-tests-pure-checker-1
                                             comp-tests-pure-checker-2))))
     (load (native-compile (ert-resource-file "comp-test-pure.el")))
diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el
index 0a68d51..a4d8581 100644
--- a/test/src/emacs-module-tests.el
+++ b/test/src/emacs-module-tests.el
@@ -37,7 +37,9 @@
   "File name of the Emacs binary currently running.")
 
 (eval-and-compile
-  (defconst mod-test-file (ert-resource-file "mod-test")
+  (defconst mod-test-file
+    (expand-file-name "../test/src/emacs-module-resources/mod-test"
+                      invocation-directory)
     "File name of the module test file."))
 
 (require 'mod-test mod-test-file)
diff --git a/test/src/emacs-resources/seccomp-filter-exec.bpf 
b/test/src/emacs-resources/seccomp-filter-exec.bpf
deleted file mode 120000
index 5b0e997..0000000
--- a/test/src/emacs-resources/seccomp-filter-exec.bpf
+++ /dev/null
@@ -1 +0,0 @@
-../../../lib-src/seccomp-filter-exec.bpf
\ No newline at end of file
diff --git a/test/src/emacs-resources/seccomp-filter.bpf 
b/test/src/emacs-resources/seccomp-filter.bpf
deleted file mode 120000
index b3d603d..0000000
--- a/test/src/emacs-resources/seccomp-filter.bpf
+++ /dev/null
@@ -1 +0,0 @@
-../../../lib-src/seccomp-filter.bpf
\ No newline at end of file
diff --git a/test/src/emacs-tests.el b/test/src/emacs-tests.el
index ee5586f..ac08e05 100644
--- a/test/src/emacs-tests.el
+++ b/test/src/emacs-tests.el
@@ -25,10 +25,13 @@
 
 (require 'cl-lib)
 (require 'ert)
-(require 'ert-x)
 (require 'rx)
 (require 'subr-x)
 
+(defconst emacs-tests--lib-src
+  (substitute-in-file-name "$EMACS_TEST_DIRECTORY/../lib-src/")
+  "Location of the lib-src directory.")
+
 (ert-deftest emacs-tests/seccomp/absent-file ()
   (skip-unless (string-match-p (rx bow "SECCOMP" eow)
                                system-configuration-features))
@@ -135,7 +138,8 @@ to `make-temp-file', which see."
                                system-configuration-features))
   (let ((emacs
          (expand-file-name invocation-name invocation-directory))
-        (filter (ert-resource-file "seccomp-filter.bpf"))
+        (filter (expand-file-name "seccomp-filter.bpf"
+                                  emacs-tests--lib-src))
         (process-environment nil))
     (skip-unless (file-executable-p emacs))
     (skip-unless (file-readable-p filter))
@@ -160,7 +164,8 @@ to `make-temp-file', which see."
                                system-configuration-features))
   (let ((emacs
          (expand-file-name invocation-name invocation-directory))
-        (filter (ert-resource-file "seccomp-filter.bpf"))
+        (filter (expand-file-name "seccomp-filter.bpf"
+                                  emacs-tests--lib-src))
         (process-environment nil))
     (skip-unless (file-executable-p emacs))
     (skip-unless (file-readable-p filter))
@@ -186,7 +191,8 @@ to `make-temp-file', which see."
         (bwrap (executable-find "bwrap"))
         (emacs
          (expand-file-name invocation-name invocation-directory))
-        (filter (ert-resource-file "seccomp-filter-exec.bpf"))
+        (filter (expand-file-name "seccomp-filter-exec.bpf"
+                                  emacs-tests--lib-src))
         (process-environment nil))
     (skip-unless bash)
     (skip-unless bwrap)
diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el
index f2a60bc..dac8f95 100644
--- a/test/src/lread-tests.el
+++ b/test/src/lread-tests.el
@@ -196,4 +196,71 @@ literals (Bug#20852)."
     (should-error (read-event "foo: "))
     (should-error (read-char-exclusive "foo: "))))
 
+(ert-deftest lread-float ()
+  (should (equal (read "13") 13))
+  (should (equal (read "+13") 13))
+  (should (equal (read "-13") -13))
+  (should (equal (read "13.") 13))
+  (should (equal (read "+13.") 13))
+  (should (equal (read "-13.") -13))
+  (should (equal (read "13.25") 13.25))
+  (should (equal (read "+13.25") 13.25))
+  (should (equal (read "-13.25") -13.25))
+  (should (equal (read ".25") 0.25))
+  (should (equal (read "+.25") 0.25))
+  (should (equal (read "-.25") -0.25))
+  (should (equal (read "13e4") 130000.0))
+  (should (equal (read "+13e4") 130000.0))
+  (should (equal (read "-13e4") -130000.0))
+  (should (equal (read "13e+4") 130000.0))
+  (should (equal (read "+13e+4") 130000.0))
+  (should (equal (read "-13e+4") -130000.0))
+  (should (equal (read "625e-4") 0.0625))
+  (should (equal (read "+625e-4") 0.0625))
+  (should (equal (read "-625e-4") -0.0625))
+  (should (equal (read "1.25e2") 125.0))
+  (should (equal (read "+1.25e2") 125.0))
+  (should (equal (read "-1.25e2") -125.0))
+  (should (equal (read "1.25e+2") 125.0))
+  (should (equal (read "+1.25e+2") 125.0))
+  (should (equal (read "-1.25e+2") -125.0))
+  (should (equal (read "1.25e-1") 0.125))
+  (should (equal (read "+1.25e-1") 0.125))
+  (should (equal (read "-1.25e-1") -0.125))
+  (should (equal (read "4.e3") 4000.0))
+  (should (equal (read "+4.e3") 4000.0))
+  (should (equal (read "-4.e3") -4000.0))
+  (should (equal (read "4.e+3") 4000.0))
+  (should (equal (read "+4.e+3") 4000.0))
+  (should (equal (read "-4.e+3") -4000.0))
+  (should (equal (read "5.e-1") 0.5))
+  (should (equal (read "+5.e-1") 0.5))
+  (should (equal (read "-5.e-1") -0.5))
+  (should (equal (read "0") 0))
+  (should (equal (read "+0") 0))
+  (should (equal (read "-0") 0))
+  (should (equal (read "0.") 0))
+  (should (equal (read "+0.") 0))
+  (should (equal (read "-0.") 0))
+  (should (equal (read "0.0") 0.0))
+  (should (equal (read "+0.0") 0.0))
+  (should (equal (read "-0.0") -0.0))
+  (should (equal (read "0e5") 0.0))
+  (should (equal (read "+0e5") 0.0))
+  (should (equal (read "-0e5") -0.0))
+  (should (equal (read "0e-5") 0.0))
+  (should (equal (read "+0e-5") 0.0))
+  (should (equal (read "-0e-5") -0.0))
+  (should (equal (read ".0e-5") 0.0))
+  (should (equal (read "+.0e-5") 0.0))
+  (should (equal (read "-.0e-5") -0.0))
+  (should (equal (read "0.0e-5") 0.0))
+  (should (equal (read "+0.0e-5") 0.0))
+  (should (equal (read "-0.0e-5") -0.0))
+  (should (equal (read "0.e-5") 0.0))
+  (should (equal (read "+0.e-5") 0.0))
+  (should (equal (read "-0.e-5") -0.0))
+  )
+
+
 ;;; lread-tests.el ends here
diff --git a/test/src/syntax-tests.el b/test/src/syntax-tests.el
index 479b818..e4e3054 100644
--- a/test/src/syntax-tests.el
+++ b/test/src/syntax-tests.el
@@ -21,6 +21,7 @@
 
 (require 'ert)
 (require 'ert-x)
+(require 'cl-lib)
 
 (ert-deftest parse-partial-sexp-continue-over-comment-marker ()
   "Continue a parse that stopped in the middle of a comment marker."
@@ -56,6 +57,16 @@
       (should (equal (parse-partial-sexp aftC pointX nil nil pps-aftC)
                      ppsX)))))
 
+(ert-deftest syntax-class-character-test ()
+  (cl-loop for char across " .w_()'\"$\\/<>@!|"
+           for i from 0
+           do (should (= char (syntax-class-to-char i)))
+           when (string-to-syntax (string char))
+           do (should (= char (syntax-class-to-char
+                               (car (string-to-syntax (string char)))))))
+  (should-error (syntax-class-to-char -1))
+  (should-error (syntax-class-to-char 200)))
+
 (ert-deftest parse-partial-sexp-paren-comments ()
   "Test syntax parsing with paren comment markers.
 Specifically, where the first character of the comment marker is



reply via email to

[Prev in Thread] Current Thread [Next in Thread]